Bir dize var User name (sales)
ve köşeli ayraçlar arasındaki metni ayıklamak istiyorum, bunu nasıl yaparım?
Alt dizeden şüpheliyim ama kapanış parantezine kadar okumayı öğrenemiyorum, metnin uzunluğu değişecektir.
Bir dize var User name (sales)
ve köşeli ayraçlar arasındaki metni ayıklamak istiyorum, bunu nasıl yaparım?
Alt dizeden şüpheliyim ama kapanış parantezine kadar okumayı öğrenemiyorum, metnin uzunluğu değişecektir.
Yanıtlar:
Düzenli ifadelerden uzak durmak isterseniz, aklıma gelen en basit yol:
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
içeren giriş dizeleri ayıklamak)sales(
(sales(
Bunu yapmanın çok basit bir yolu düzenli ifadeler kullanmaktır:
Regex.Match("User name (sales)", @"\(([^)]*)\)").Groups[1].Value
(Çok komik) yoruma bir cevap olarak, burada bazı açıklamalarla aynı 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(")"));
Yalnızca bir çift paranteziniz olduğunu varsayarsak.
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);
. Bir düzenlemeyi sıraya
Bu işlevi kullanın:
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));
}
ve işte kullanımı:
GetSubstringByString("(", ")", "User name (sales)")
ve çıktı:
sales
Düzenli ifadeler burada en iyi araç olabilir. Onlara aşina değilseniz, harika bir küçük regex aracı olan Expresso'yu yüklemenizi tavsiye ederim .
Gibi bir şey:
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))
varsa, örneğin iç parantez input.LastIndexOf(')')
varsa ya da olmasa da işe yarayacak olanı kullanmak isteyebilirsiniz .
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);
regex
Yöntem bence üstündür, ancak mütevazı kullanmak istiyorsasubstring
string input= "my name is (Jayne C)";
int start = input.IndexOf("(");
int stop = input.IndexOf(")");
string output = input.Substring(start+1, stop - start - 1);
veya
string input = "my name is (Jayne C)";
string output = input.Substring(input.IndexOf("(") +1, input.IndexOf(")")- input.IndexOf("(")- 1);
Regex kullanmaktan kaçınan genel amaçlı okunabilir bir fonksiyon:
// 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);
}
Özel örneğinizde aramak için şunları yapabilirsiniz:
string result = ExtractBetween("User name (sales)", "(", ")");
Düzenli ifadelerin son derece yararlı olduğunu ancak yazmanın çok zor olduğunu düşünüyorum. Bu yüzden biraz araştırma yaptım ve yazmayı çok kolaylaştıran bu aracı buldum .
Onlardan uzak durmayın çünkü sözdiziminin anlaşılması zordur. Çok güçlü olabilirler.
Çok benzer bir uygulamaya bir çözüm ararken buna rastladım.
İşte gerçek kodumdan bir pasaj. Alt karakter dizisini ilk karakterden başlatır (dizin 0).
string separator = "\n"; //line terminator
string output;
string input= "HowAreYou?\nLets go there!";
output = input.Substring(0, input.IndexOf(separator));
Bu kod, buradaki çoğu çözümden daha hızlıdır (hepsi değilse de), Dize uzantısı yöntemi olarak paketlenmiştir , özyinelemeli yuvalamayı desteklemez:
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;
}
Bu biraz daha uzun ve yavaş, ancak özyinelemeli yuvalamayı daha güzel idare ediyor:
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;
}