我有以下代码行,
if((s1 != null) && (!s1.Trim().Equals("")))
如何分割上面的字符串,以便我可以获得子括号内的所有文本?
因此,结果数组将包含s1 != null
和!s1.Trim().Equals("")
是否有任何通用方法,以便它可以应用于n个&&
的字符串?
答案 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)
此示例将表达式拆分为术语。您可以随意修改它以删除每个单词的括号。另一方面,在上面的示例中,不需要与&&
结合的术语括号,。
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("))