在C#中的php(pcre)中找到的分支重置运算符(“?|”)的等价物是什么?

问题描述 投票:9回答:3

以下正则表达式将匹配“星期六”或“星期日”:(?:(Sat)ur|(Sun))day

但是在一种情况下,后向引用1被填充,而后向引用2是空的而在另一种情况下反之亦然。

PHP(pcre)提供了一个很好的运算符“?|”这可以避免这个问题。以前的正则表达式将成为(?|(Sat)ur|(Sun))day。所以不会有空的反向引用。

在C#或某些解决方法中是否存在等价物?

c# php regex branch reset
3个回答
12
投票

.NET不支持branch-reset操作符,但它支持命名组,它允许您无限制地重用组名(没有其他风格的东西,AFAIK)。所以你可以使用这个:

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

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


3
投票

应该可以连接backref1和backref2。 由于其中一个总是空的,一个字符串concat with empty仍然是相同的字符串...

与你的正则表达(?:(Sat)ur|(Sun))day和替换$1$2 你得到SatSaturdaySunSunday

 regex (?:(Sat)ur|(Sun))day
 input    | backref1 _$1_ | backref2 _$2_ | 'concat' _$1$2_
 ---------|---------------|---------------|----------------
 Saturday | 'Sat'         | ''            | 'Sat'+'' = Sat
 Sunday   | ''            | 'Sun'         | ''+'Sun' = Sun

而不是读取backref1或backref2只读取两个结果并连接结果。


-1
投票

您可以使用branch-reset运算符:

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

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

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.