2017-04-12 126 views
2

,我有以下的代碼行,如何獲得括號內的子串在C#中的字符串?

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

我怎麼可以拆分上面的字符串,這樣我可以得到次括號內的所有文本? 所以結果數組將包含s1 != null!s1.Trim().Equals("") 有沒有通用的方法,以便它可以被應用到與&& n個字符串?

回答

4

您可以使用Regex

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("") 

您還可以give a name to each group這樣的:

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("") 

舒爾,您應訪問匹配的結果之前(如果有)添加一些檢查。

正則表達式的解釋

  1. \({2}:匹配的字符(兩次;
  2. (*):任何字符多次儘可能相匹配;
  3. \)\小號& & \ S:匹配的),接着:一個或多個空格,二符號,一個或多個空間;
  4. 類似於第一點
2

此示例將表達成條件。隨意修改它也可以刪除每個單詞的括號。在另一方面,在上面的例子中與周圍&&合併條款的括號不需要,.

 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(")) 
相關問題