正则表达式:如何捕获重复捕获组中的所有迭代

5
我会翻译以下这些C#代码:

我会期望以下这些C#代码:

var regex = new Regex("A(bC*)*");
var match = regex.Match("AbCCbbCbCCCCbbb");
var groups = match.Groups;

返回类似以下内容:

["AbCCbbCbCCCCbbb", "A", "bCC", "b", "bC", "bCCC", "b", "b", "b"]

但实际上,它只返回最后一个匹配到的结果:

["AbCCbbCbCCCCbbb", "b"]
这里Regex101也会显示以下警告信息:

重复的捕获组只会捕获最后一次迭代。将一个捕获组放在重复组周围以捕获所有迭代,或者如果您不关心数据,则使用非捕获组替代。

我应该如何更改我的正则表达式模式?


Regex101不支持.NET正则表达式。 - Wiktor Stribiżew
将重复的组放入捕获组中,以捕获所有迭代。 - vgru
@Groo 我试过了,但是没有成功。 - Reza Ahmadi
2个回答

2
如果你也想捕获 A,只需用括号将其包裹起来:new Regex("(A)(bC*)*")。请参见正则表达式演示

enter image description here

然后,收集你在 CaptureCollection 中获得的所有值:
var regex = new Regex("(A)(bC*)*");
var match = regex.Matches("AbCCbbCbCCCCbbb")
     .Cast<Match>()
     .SelectMany(x => x.Groups.Cast<Group>()
          .SelectMany(v => v.Captures
              .Cast<Capture>()
              .Select(t => t.Value)
          )
     )
     .ToList();
 foreach (var s in match)
     Console.WriteLine(s);

请查看C#演示

1
也许尝试这个:

A|b(C+)?

Notepad++ 中测试过

编辑:如果你想使用带组的这个模式:

(A)|(b(C+)?)

它在regex101中使用javascript风格和notepad++中工作,但在Visual Studio、C#中不起作用。它返回{"A", "A", "", ""}。 - Reza Ahmadi
注意:这是完全不同的模式。例如,该模式将匹配“bCCbbCbCCCCbbb”,而OG的正则表达式则不会。 - MrCC
我认为如果你需要一个不错的正则表达式解析器,最好不要使用.NET。你知道除了一些特定于语言的扩展(这里没有使用任何扩展),正则表达式的捕获行为是标准化的,并且在任何地方都可以工作。如果在.NET中不起作用,那么它就是有问题的。捕获不是“风味”的一部分,语言不能在这个方面自由选择。他们可以扩展标准,但对于提问者想要做的事情,不需要扩展。 - Mecki

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