在C#中,与PHP(PCRE)中的分支重置运算符(“?|”)相当的是什么?

11
以下正则表达式将匹配 "Saturday" 或 "Sunday": (?:(Sat)ur|(Sun))day 但在某些情况下,回溯引用1被填充而回溯引用2为空,在另一种情况下则相反。
PHP(pcre)提供了一个很好的运算符 "?|" 来避免这个问题。前面的正则表达式变成了(?|(Sat)ur|(Sun))day。因此,不会有空的回溯引用。
在C#中是否有等效的方法或解决方法?

2
你可以使用(?:(Sat(?=ur)|Sun(?!ur))(?:ur)?)day代替。 :) - Gumbo
@Gumbo 为什么Sun后面没有跟着“ur”?这个正则表达式有点复杂... - Stephan
否则,可能会匹配到“Sunurday”。这有点像我犯的错误(你指出来的 :))。 - Bart Kiers
否则它也会匹配“Sunurday”。 - Gumbo
3个回答

15

.NET不支持分支重置操作符,但支持命名组,并允许您无限制地重用组名称(据我所知,其他任何语言都不支持这一点)。因此,您可以使用以下内容:

(?:(?<abbr>Sat)ur|(?<abbr>Sun))day

缩略名将存储在 Match.Groups["abbr"] 中。


是的,在处理正则表达式时,这是正确的方法。很好。 - Bart Kiers
3
Perl允许您在同一模式中重用已命名的分组,没有任何限制。这也使您能够返回与命名分组匹配的列表。 - tchrist
3
使用PCRE时,你可以使用(?J)修饰符(必须放在模式的第一位),它允许使用同名的命名组。(这是一次性的选项,在之后不能取消)。 - Casimir et Hippolyte
此答案已添加到 Stack Overflow 正则表达式 FAQ 中的“组”部分。 - aliteralmind
1
Python的正则表达式允许重复使用组名,但当然它也知道分支重置运算符。 - AXO

4
应该可以将backref1和backref2合并。由于一个为空字符串,与空字符串拼接的结果仍然是原字符串...
使用正则表达式 (?:(Sat)ur|(Sun))day 和替换值$1$2,你可以获得 SaturdaySatSundaySun
 正则表达式 (?:(Sat)ur|(Sun))day
 输入    | 返回值 _$1_ | 返回值 _$2_ | '连接' _$1$2_
 ---------|---------------|---------------|----------------
 Saturday | 'Sat'         | ''            | 'Sat'+'' = Sat
 Sunday   | ''            | 'Sun'         | ''+'Sun' = Sun
不要单独读取返回值 _$1_ 或 _$2_,直接读取两个结果并将它们连接起来。

我更喜欢直接获得结果,而不对输入字符串进行任何操作(如分支重置运算符)。 - Stephan
@Stephan,我不明白你的评论?我认为我没有对输入字符串进行操作。我只是指出您可以在不更改正则表达式的情况下将group1和group2与regex结果连接起来。 - bw_üezi
@bw_üezi,你能否编辑你的答案并提供详细的示例代码,因为我仍然不理解你的解决方案。 - Stephan
1
+1 这似乎比让正则表达式变得更复杂以便在一个反向引用中获取所需值要好得多。 - juharr
@juharr 谢谢您理解我这个KISS解决方案;-) - bw_üezi
显示剩余2条评论

-2

您可以使用分支重置运算符:

(?|foo(bar)|still(life)|(like)so)

无论哪个分支匹配,它只会设置第一组。


3
我原以为 StackOverflow 是寻找高质量答案而不是数量的地方。 - Robert Synoradzki

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