2012-12-20 18 views
5

Załóżmy, że jest to tekst, który jak poniżej:Pierwsze konkretną część tekstu w ścisłym tekstu

string str = @"stackoverflow(stosie:stackoverflow)overstackflow(nad:stackoverflow)";

Chcę dostać pogrubienie pól. Chyba muszę znaleźć „(” a „:” w tekście i uzyskać tekst pomiędzy z nich jest prawda

Wszelkie porady

+0

Czy myśli odwrócone, pojedyncze apostrofy w środku swojej ciąg? W tej chwili nie kodują twoich tagów. – Rawling

+0

załóżmy, że istnieje tekst i chcę uzyskać tekst pomiędzy (i: operatorami.) Jak mogę to zrobić? –

+0

Czy chcesz uzyskać odpowiedź tak/nie? Dlaczego nie spróbować sam? – slawekwin

Odpowiedz

6

może z gładkimi string metod:

IList<String> foundStrings = new List<String>(); 
int currentIndex = 0; 
int index = str.IndexOf("(", currentIndex); 
while(index != -1) 
{ 
    int start = index + "(".Length; 
    int colonIndex = str.IndexOf(":", start); 
    if (colonIndex != -1) 
    { 
     string nextFound = str.Substring(start, colonIndex - start); 
     foundStrings.Add(nextFound); 
    } 
    currentIndex = start; 
    index = str.IndexOf("(", currentIndex); 
} 

Demo

+0

Dziękuję Tim Schmelter, to jest naprawdę fajne .. –

+0

@Tim Czy używasz tylko [ideone.com] (http://ideone.com) podczas odpowiadania w SO, czy też używasz Visual Studio? szybciej? –

+0

@ SonerGönül: Tylko do celów demonstracyjnych Nie jest szybszy, używa mono, który ma wiele ograniczeń –

1
string strRegex = @"\((.+?)\:"; 
RegexOptions myRegexOptions = RegexOptions.None; 
Regex myRegex = new Regex(strRegex, myRegexOptions); 
string strTargetString = @"stackoverflow(stack:stackoverflow)overstackflow(over:stackoverflow)"; 

foreach (Match myMatch in myRegex.Matches(strTargetString)) 
{ 
    if (myMatch.Success) 
    { 
    // Add your code here 
    } 
} 
+0

Nie ma sensu sprawdzanie 'myMatch.Success', ale możesz chcieć pokazać, jak uzyskać' Wartość 'out – Rawling

1

pójdę na coś takiego:

Regex matcher = new Regex(@"([^():}]+)\(([^():}]*):([^():}]*)\)"); 
MatchCollection matches = matcher.Matches(str); 

będzie to wyglądać za pośrednictwem wejścia za wszystko, co wygląda jak group1(group2:group3). (Jeśli którykolwiek z tych grup zawiera (, ) lub : cała sprawa zostanie zignorowany, ponieważ nie może dowiedzieć się, co ma być gdzie.)

Można wówczas uzyskać dopasowane wartości, jak na przykład

foreach(Match m in matches) 
{ 
    Console.WriteLine("First: {0}, Second: {1}, Third{2}", 
     m.Groups[1].Value, m.Groups[2].Value, m.Groups[3].Value); 
} 

więc jeśli chcesz tylko bity między ( i : można użyć

foreach(Match m in matches) 
{ 
    Console.WriteLine(m.Groups[2].Value); 
} 
1
public static void Main(string[] args) 
     { 
      string str = @"stackoverflow(stack:stackoverflow)overstackflow(over:stackoverflow)"; 
      Console.WriteLine(ExtractString(str)); 
     } 

     static string ExtractString(string s) 
     { 
      var start = "("; 
      int startIndex = s.IndexOf(start) + start.Length; 
      int endIndex = s.IndexOf(":", startIndex); 
      return s.Substring(startIndex, endIndex - startIndex); 
     } 

Wynik to stack, ale można go użyć w pętli foreach dla iteracji do łańcucha znaków.

Demo

Powiązane problemy