ฉันมีสตริงUser name (sales)
และฉันต้องการแยกข้อความระหว่างวงเล็บปีกกาฉันจะทำอย่างไร
ฉันสงสัยว่าสตริงย่อย แต่ฉันไม่สามารถหาวิธีการอ่านจนกระทั่งวงเล็บปิดความยาวของข้อความจะแตกต่างกัน
ฉันมีสตริงUser name (sales)
และฉันต้องการแยกข้อความระหว่างวงเล็บปีกกาฉันจะทำอย่างไร
ฉันสงสัยว่าสตริงย่อย แต่ฉันไม่สามารถหาวิธีการอ่านจนกระทั่งวงเล็บปิดความยาวของข้อความจะแตกต่างกัน
คำตอบ:
หากคุณต้องการที่จะอยู่ให้ห่างจากการแสดงออกปกติวิธีที่ง่ายที่สุดที่ฉันคิดได้คือ:
string input = "User name (sales)";
string output = input.Split('(', ')')[1];
var input = "(fdw) User name (sales) safdsdf (again?)"; var output = input.Split('(', ')').Where((item, index) => index % 2 != 0).ToList();
sales
ยังมาจากการป้อนข้อมูลที่มีสตริง)sales(
, (sales(
ฯลฯ
วิธีง่ายๆในการทำคือใช้นิพจน์ทั่วไป:
Regex.Match("User name (sales)", @"\(([^)]*)\)").Groups[1].Value
เพื่อเป็นการตอบสนองต่อความคิดเห็น (ตลกมาก) นี่คือ Regex เดียวกันพร้อมคำอธิบายบางส่วน:
\( # Escaped parenthesis, means "starts with a '(' character"
( # Parentheses in a regex mean "put (capture) the stuff
# in between into the Groups array"
[^)] # Any character that is not a ')' character
* # Zero or more occurrences of the aforementioned "non ')' char"
) # Close the capturing group
\) # "Ends with a ')' character"
var filterRegex = new Regex(Regex.Escape("(") + "([^()]*)" + Regex.Escape(")"));
สมมติว่าคุณมีวงเล็บหนึ่งคู่
string s = "User name (sales)";
int start = s.IndexOf("(") + 1;
int end = s.IndexOf(")", start);
string result = s.Substring(start, end - start);
int end = s.IndexOf(")", start);
คุณสิทธิกำลังที่ควรจะเป็น ฉันรอคิวการแก้ไข ...
ใช้ฟังก์ชั่นนี้:
public string GetSubstringByString(string a, string b, string c)
{
return c.Substring((c.IndexOf(a) + a.Length), (c.IndexOf(b) - c.IndexOf(a) - a.Length));
}
และนี่คือการใช้งาน:
GetSubstringByString("(", ")", "User name (sales)")
และผลลัพธ์จะเป็น:
sales
นิพจน์ทั่วไปอาจเป็นเครื่องมือที่ดีที่สุดที่นี่ หากคุณไม่คุ้นเคยกับพวกเขาฉันขอแนะนำให้คุณติดตั้งExpresso - เครื่องมือ regex เล็ก ๆ
สิ่งที่ต้องการ:
Regex regex = new Regex("\\((?<TextInsideBrackets>\\w+)\\)");
string incomingValue = "Username (sales)";
string insideBrackets = null;
Match match = regex.Match(incomingValue);
if(match.Success)
{
insideBrackets = match.Groups["TextInsideBrackets"].Value;
}
string input = "User name (sales)";
string output = input.Substring(input.IndexOf('(') + 1, input.IndexOf(')') - input.IndexOf('(') - 1);
input = "User name (sales(1))
คุณอาจต้องการใช้input.LastIndexOf(')')
ซึ่งจะทำงานหากมีวงเล็บภายในหรือไม่
Regex อาจจะ? ฉันคิดว่ามันจะทำงาน ...
\(([a-z]+?)\)
using System;
using System.Text.RegularExpressions;
private IEnumerable<string> GetSubStrings(string input, string start, string end)
{
Regex r = new Regex(Regex.Escape(start) +`"(.*?)"` + Regex.Escape(end));
MatchCollection matches = r.Matches(input);
foreach (Match match in matches)
yield return match.Groups[1].Value;
}
ใช้นิพจน์ปกติ:
string test = "(test)";
string word = Regex.Match(test, @"\((\w+)\)").Groups[1].Value;
Console.WriteLine(word);
int start = input.IndexOf("(") + 1;
int length = input.IndexOf(")") - start;
output = input.Substring(start, length);
input.Remove(input.IndexOf(')')).Substring(input.IndexOf('(') + 1);
regex
วิธีการที่ดีกว่าผมคิดว่า แต่ถ้าคุณต้องการที่จะใช้อ่อนน้อมถ่อมตนsubstring
string input= "my name is (Jayne C)";
int start = input.IndexOf("(");
int stop = input.IndexOf(")");
string output = input.Substring(start+1, stop - start - 1);
หรือ
string input = "my name is (Jayne C)";
string output = input.Substring(input.IndexOf("(") +1, input.IndexOf(")")- input.IndexOf("(")- 1);
นี่คือฟังก์ชั่นการอ่านที่ใช้งานทั่วไปที่หลีกเลี่ยงการใช้ regex:
// Returns the text between 'start' and 'end'.
string ExtractBetween(string text, string start, string end)
{
int iStart = text.IndexOf(start);
iStart = (iStart == -1) ? 0 : iStart + start.Length;
int iEnd = text.LastIndexOf(end);
if(iEnd == -1)
{
iEnd = text.Length;
}
int len = iEnd - iStart;
return text.Substring(iStart, len);
}
หากต้องการโทรหาในตัวอย่างเฉพาะของคุณคุณสามารถทำได้:
string result = ExtractBetween("User name (sales)", "(", ")");
ฉันพบว่านิพจน์ทั่วไปนั้นมีประโยชน์มาก แต่เขียนยากมาก ดังนั้นฉันจึงทำการวิจัยและพบว่าเครื่องมือนี้ทำให้การเขียนง่ายขึ้น
อย่าอายไปจากพวกเขาเพราะไวยากรณ์ยากที่จะเข้าใจ พวกมันมีพลังมาก
ฉันเจอสิ่งนี้ในขณะที่ฉันกำลังมองหาวิธีการใช้งานที่คล้ายกันมาก
นี่คือตัวอย่างจากรหัสจริงของฉัน เริ่มซับสตริงจากอักขระตัวแรก (ดัชนี 0)
string separator = "\n"; //line terminator
string output;
string input= "HowAreYou?\nLets go there!";
output = input.Substring(0, input.IndexOf(separator));
รหัสนี้เร็วกว่าโซลูชันส่วนใหญ่ที่นี่ (หากไม่ใช่ทั้งหมด) ซึ่งบรรจุเป็นวิธีส่วนขยายของสตริง จะไม่สนับสนุนการทำซ้ำแบบเรียกซ้ำ:
public static string GetNestedString(this string str, char start, char end)
{
int s = -1;
int i = -1;
while (++i < str.Length)
if (str[i] == start)
{
s = i;
break;
}
int e = -1;
while(++i < str.Length)
if (str[i] == end)
{
e = i;
break;
}
if (e > s)
return str.Substring(s + 1, e - s - 1);
return null;
}
อันนี้ยาวกว่าและช้ากว่าเล็กน้อย แต่มันสามารถทำรังแบบเรียกซ้ำได้ดีกว่า:
public static string GetNestedString(this string str, char start, char end)
{
int s = -1;
int i = -1;
while (++i < str.Length)
if (str[i] == start)
{
s = i;
break;
}
int e = -1;
int depth = 0;
while (++i < str.Length)
if (str[i] == end)
{
e = i;
if (depth == 0)
break;
else
--depth;
}
else if (str[i] == start)
++depth;
if (e > s)
return str.Substring(s + 1, e - s - 1);
return null;
}