Saya memiliki string User name (sales)
dan saya ingin mengekstrak teks di antara tanda kurung, bagaimana saya melakukan ini?
Saya curiga sub-string tetapi saya tidak tahu cara membaca sampai braket penutup, panjang teks akan bervariasi.
Saya memiliki string User name (sales)
dan saya ingin mengekstrak teks di antara tanda kurung, bagaimana saya melakukan ini?
Saya curiga sub-string tetapi saya tidak tahu cara membaca sampai braket penutup, panjang teks akan bervariasi.
Jawaban:
Jika Anda ingin menjauh dari ekspresi reguler, cara paling sederhana yang dapat saya pikirkan adalah:
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
juga dari string input yang mengandung )sales(
, (sales(
dll.
Cara yang sangat sederhana untuk melakukannya adalah dengan menggunakan ekspresi reguler:
Regex.Match("User name (sales)", @"\(([^)]*)\)").Groups[1].Value
Sebagai tanggapan terhadap komentar (sangat lucu), inilah Regex yang sama dengan beberapa penjelasan:
\( # 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(")"));
Dengan asumsi bahwa Anda hanya memiliki sepasang kurung.
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);
. Saya sudah mengantri hasil edit ...
Gunakan fungsi ini:
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));
}
dan di sini adalah penggunaannya:
GetSubstringByString("(", ")", "User name (sales)")
dan hasilnya adalah:
sales
Ekspresi reguler mungkin menjadi alat terbaik di sini. Jika Anda tidak terbiasa dengan mereka, saya sarankan Anda menginstal Expresso - alat regex kecil yang hebat.
Sesuatu seperti:
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))
Anda mungkin ingin menggunakan input.LastIndexOf(')')
yang akan bekerja jika ada kurung dalam atau tidak.
Regex mungkin? Saya pikir ini akan berhasil ...
\(([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;
}
int start = input.IndexOf("(") + 1;
int length = input.IndexOf(")") - start;
output = input.Substring(start, length);
The regex
Metode unggul Saya pikir, tetapi jika Anda ingin menggunakan rendah hatisubstring
string input= "my name is (Jayne C)";
int start = input.IndexOf("(");
int stop = input.IndexOf(")");
string output = input.Substring(start+1, stop - start - 1);
atau
string input = "my name is (Jayne C)";
string output = input.Substring(input.IndexOf("(") +1, input.IndexOf(")")- input.IndexOf("(")- 1);
Berikut adalah fungsi yang dapat dibaca untuk tujuan umum yang menghindari penggunaan 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);
}
Untuk menyebutnya dalam contoh khusus Anda, Anda dapat melakukan:
string result = ExtractBetween("User name (sales)", "(", ")");
Saya menemukan bahwa ekspresi reguler sangat berguna tetapi sangat sulit untuk ditulis. Jadi, saya melakukan riset dan menemukan alat ini yang membuat penulisan mereka jadi mudah.
Jangan menghindar dari mereka karena sintaksinya sulit untuk dipecahkan. Mereka bisa sangat kuat.
Saya menemukan ini ketika saya sedang mencari solusi untuk implementasi yang sangat mirip.
Ini cuplikan dari kode saya yang sebenarnya. Mulai substring dari char pertama (indeks 0).
string separator = "\n"; //line terminator
string output;
string input= "HowAreYou?\nLets go there!";
output = input.Substring(0, input.IndexOf(separator));
Kode ini lebih cepat daripada kebanyakan solusi di sini (jika tidak semua), dikemas sebagai metode ekstensi String , ini tidak mendukung penyatuan rekursif:
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;
}
Yang ini sedikit lebih lama dan lebih lambat, tetapi ia menangani sarang rekursif dengan lebih baik:
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;
}