这是.NET的Regex.Split中的一个bug吗?

5

我有两个正则表达式,用于与Regex.Split一起使用:

(?<=\G[^,],[^,],)

并且

(?<=\G([^,],){2})

当分割字符串"A,B,C,D,E,F,G,"时,第一个结果为:
A,B, 
C,D, 
E,F, 
G, 

第二个结果是:

A,B, 
A, 
C,D, 
C, 
E,F, 
E, 
G, 

这里发生了什么事?我原以为(X){2}总是等同于XX,但现在不确定了。在我的实际问题中,我需要做更加复杂的操作,而且我需要这样做六十九次,所以简单地重复这个模式并不理想。
2个回答

6

Regex.Split文档中可以看到:

如果在 Regex.Split 表达式中使用捕获括号,则任何已捕获的文本都包含在生成的字符串数组中。

内部括号是用于捕获的。尝试使用(?:[^,],)代替。


3
使用 RegexOptions.ExplicitCapture 参数或传递该参数。 - Scott Chamberlain
啊,那其实是个很棒的功能。可惜它反直觉且有点奇怪。 - John Gietzen
@JohnGietzen 我应该指出许多编程语言都共享这个特性。 - Explosion Pills
我很少使用Regex.Split,所以这对我来说是新的。 - John Gietzen

2

来自文档

如果在Regex.Split表达式中使用捕获括号,则任何捕获的文本都包含在生成的字符串数组中。

您的第二个表达式中有一个捕获组。请尝试非捕获括号:

(?<=\G(?:[^,],){2})

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