如何在c#中的字符串中获取括号内的子串?

时间:2017-04-12 06:08:49

标签: c# .net split

我有以下代码行,

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

如何分割上面的字符串,以便我可以获得子括号内的所有文本? 因此,结果数组将包含s1 != null!s1.Trim().Equals("") 是否有任何通用方法,以便它可以应用于n个&&的字符串?

2 个答案:

答案 0 :(得分: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("")

Shure,您应该在访问匹配结果之前添加一些检查(如果有)。

正则表达式解释

  1. \({2}:匹配角色(两次;
  2. (。*):尽可能多地匹配任何字符;
  3. \)\ s&amp;&amp; \ s:匹配a)后跟:一个或多个空格,两个&符号,一个或多个空格;
  4. 类似于第一点

答案 1 :(得分: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("))