我需要找到最小长度的匹配字符串,但我的代码显示正好相反,我该如何修复它?
string line = @"xxxxxxxxxxxx A(a,b) and A(a,b) > 0 xxxxxxxxx \n xxxxxxxxx A(a,b) and A(a,b) > 0 xxxxxxxxxxxxxxxxxx";
string Pattern = "A.+?>";
MatchCollection M1 = Regex.Matches(line, Pattern);
Console.WriteLine(M1[0].ToString()); //I want 【A(a,b) >】 but it shows 【A(a,b) and A(a,b) >】
Console.WriteLine(M1[1].ToString()); //I want 【A(a,b) >】 but it shows 【A(a,b) and A(a,b) >】
Console.Read();
答案 0 :(得分:4)
问题是你的模式从它找到的第一个A
开始,然后匹配到它找到的下一个>
- 但正如你所看到的那样 - 可能还有另一个A
中间
这在第二个示例中很好地解释了:https://stackoverflow.com/a/3075532/7586
最简单的选项是明确匹配您想要的内容而不是.+
,例如:
string Pattern = @"A\(\w+,\w+\)\s*>";
正如评论建议的那样,负面字符类也可以使用,例如A[^A]+>
,或者如果限制太多,A\([^()]+\)\s*>
。
在这种情况下可以使用RightToLeft
matching的另一个选项,如下所示:
MatchCollection M1 = Regex.Matches(line, Pattern, RegexOptions.RightToLeft);
RightToLeft
将从>
开始,然后懒惰的标识符.+
将按预期运行 - 仅到达它找到的第一个A
。这有一个对称的问题,可能导致多个>
失败
Working example