2017-04-12 1 views
2

Ich habe die folgende Codezeile,Wie erhalten Sie die Teilstrings innerhalb der Klammern in einer Zeichenfolge in C#?

if((s1 != null) && (!s1.Trim().Equals(""))) 

Wie kann ich die obige Zeichenfolge aufgeteilt, so dass ich den gesamten Text innerhalb der Unter Klammern bekommen? Also das Ergebnis-Array wird enthalten s1 != null und !s1.Trim().Equals("") Gibt es eine generische Möglichkeit, so dass es auf Strings mit n-Nummer von && angewendet werden kann?

Antwort

4

Sie können Regex verwenden.

string input = @"if((s1 != null) && (!s1.Trim().Equals("")))"; 
string pattern = @"\({2}(.*)\)\s&&\s\((.*)\){2}"; 

var values = Regex.Matches(input, pattern); 

Console.WriteLine(values[0].Groups[1]); // s1 != null 
Console.WriteLine(values[0].Groups[2]); // !s1.Trim().Equals("") 

Sie können auch give a name to each group wie folgt aus:

string input = @"if((s1 != null) && (!s1.Trim().Equals("")))"; 
string pattern = @"\({2}(?<FirstGroup>.*)\)\s&&\s\((?<SecondGroup>.*)\){2}"; 

var values = Regex.Matches(input, pattern); 

Console.WriteLine(values[0].Groups["FirstGroup"]); // s1 != null 
Console.WriteLine(values[0].Groups["SecondGroup"]); // !s1.Trim().Equals("") 

Shure, sollten Sie ein paar Kontrollen hinzufügen, bevor Sie die angepassten Ergebnisse zugreifen (wenn es).

Regex Erklärung

  1. \ ({2}: entspricht das Zeichen (zwei Mal;
  2. (*):. Jedes Zeichen so oft wie möglich übereinstimmt;
  3. \) \ s & & \ s: entspricht a) gefolgt von: einem oder mehreren Leerzeichen, zwei kaufmännischen Und-Zeichen, einem oder mehreren Leerzeichen;
  4. ähnlich dem ersten Punkt
2

In diesem Beispiel wird ein Ausdruck in Terme aufgeteilt. Fühlen Sie sich frei, es zu ändern, um auch die Klammern um jeden einzelnen Ausdruck zu entfernen. Auf der anderen Seite, in Ihrem obigen Beispiel sind die Klammern um die Begriffe kombiniert mit && nicht erforderlich.

 var expression = @"if((s1 != null) && (!s1.Trim().Equals("")))"; 

     // remove if, everything between outer brackets is relevant 
     var firstBracket = expression.IndexOf('('); 
     var lastBracket = expression.LastIndexOf(')'); 
     string cleansed = expression.Substring(
      firstBracket + 1, 
      expression.Length - firstBracket - (expression.Length - lastBracket) - 1); 

     // split and remove whitespaces 
     var potentialTerms = cleansed.Split(new string[] { "&&" }, StringSplitOptions.None).Select(x => x.Trim()); 


     foreach (var term in potentialTerms) 
     { 
      Console.WriteLine(term); 
     } 

     // outputs: 
     // (s1 != null) 
     // (!s1.Trim().Equals(")) 
Verwandte Themen