以下正则表达式将匹配“星期六”或“星期日”:(?:(Sat)ur|(Sun))day
但是在一种情况下,后向引用1被填充,而后向引用2是空的而在另一种情况下反之亦然。
PHP(pcre)提供了一个很好的运算符“?|”这可以避免这个问题。以前的正则表达式将成为(?|(Sat)ur|(Sun))day
。所以不会有空的反向引用。
在C#或某些解决方法中是否存在等价物?
.NET不支持branch-reset操作符,但它支持命名组,它允许您无限制地重用组名(没有其他风格的东西,AFAIK)。所以你可以使用这个:
(?:(?<abbr>Sat)ur|(?<abbr>Sun))day
...缩写名称将存储在Match.Groups["abbr"]
中。
应该可以连接backref1和backref2。 由于其中一个总是空的,一个字符串concat with empty仍然是相同的字符串...
与你的正则表达(?:(Sat)ur|(Sun))day
和替换$1$2
你得到Sat
的Saturday
和Sun
的Sunday
。
regex (?:(Sat)ur|(Sun))day input | backref1 _$1_ | backref2 _$2_ | 'concat' _$1$2_ ---------|---------------|---------------|---------------- Saturday | 'Sat' | '' | 'Sat'+'' = Sat Sunday | '' | 'Sun' | ''+'Sun' = Sun
而不是读取backref1或backref2只读取两个结果并连接结果。
您可以使用branch-reset运算符:
(?|foo(bar)|still(life)|(like)so)
无论哪个分支匹配,这只会设置第一组。