(C#) 使用Regex.Matches找到最短匹配字符串

3

我需要找到匹配字符串中最短的那个,但是我的代码显示出了相反的结果,我该如何修复它?

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

尝试使用负向先行断言从.+中排除字符串A(a,b) - user202729
不知道是什么意思,A[^A]+?> 是什么? - splash58
负字符组也可以工作。 - user202729
1个回答

4
问题在于你的模式从它找到的第一个 A 开始,并匹配到下一个它找到的 > - 但正如你所看到的 - 在中间可能会有另一个 A
这在这里的第二个示例中很好地解释了: https://dev59.com/eHA75IYBdhLWcg3w1s32#3075532 最简单的选择是显式匹配你想要的内容,而不是用 .+,例如:
string Pattern = @"A\(\w+,\w+\)\s*>";

工作示例

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

在这种情况下,另一个可行的选项是使用RightToLeft匹配,像这样:

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

RightToLeft> 符号开始,然后懒惰的数量限定符 .+ 将会以你期望的方式进行操作 - 仅找到第一个 A。这有一个对称性问题,可能无法处理多个 >
工作示例


“RightToLeft” 在 “A(a,b) > >” 上可能会失败。 - user202729
@user202729 - 很好的观点。对于那种情况,它肯定会失败。我会添加一个注释。 - Kobi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接