(C#)Regex.Matches找出最小长度匹配字符串

时间:2018-01-23 06:14:00

标签: c# regex

我需要找到最小长度的匹配字符串,但我的代码显示正好相反,我该如何修复它?

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

1 个答案:

答案 0 :(得分:4)

问题是你的模式从它找到的第一个A开始,然后匹配到它找到的下一个> - 但正如你所看到的那样 - 可能还有另一个A中间 这在第二个示例中很好地解释了:https://stackoverflow.com/a/3075532/7586

最简单的选项是明确匹配您想要的内容而不是.+,例如:

string Pattern = @"A\(\w+,\w+\)\s*>";

Working example

正如评论建议的那样,负面字符类也可以使用,例如A[^A]+>,或者如果限制太多,A\([^()]+\)\s*>

在这种情况下可以使用RightToLeft matching的另一个选项,如下所示:

MatchCollection M1 = Regex.Matches(line, Pattern, RegexOptions.RightToLeft);

RightToLeft将从>开始,然后懒惰的标识符.+将按预期运行 - 仅到达它找到的第一个A。这有一个对称的问题,可能导致多个>失败 Working example