在C#中的php(pcre)中找到的分支重置运算符(“?”)的等价物是什么?
以下正则表达式将与“星期六”或“星期日”匹配:在C#中的php(pcre)中找到的分支重置运算符(“?”)的等价物是什么?,c#,php,regex,branch,reset,C#,Php,Regex,Branch,Reset,以下正则表达式将与“星期六”或“星期日”匹配:(?:(Sat)ur|(Sun))day 但在一种情况下,反向引用1被填充,而反向引用2为空,在另一种情况下,反之亦然 PHP(pcre)提供了一个很好的运算符“|”,可以绕过这个问题。以前的正则表达式将变成(?|(Sat)ur|(Sun))day。所以不会有空的反向引用 C#中是否有等效项或其他解决方法?应该可以concat backref1和backref2。因为其中一个始终为空,而concat with empty的字符串仍然是同一个字符串 使
(?:(Sat)ur|(Sun))day
但在一种情况下,反向引用1被填充,而反向引用2为空,在另一种情况下,反之亦然
PHP(pcre)提供了一个很好的运算符“|”,可以绕过这个问题。以前的正则表达式将变成(?|(Sat)ur|(Sun))day
。所以不会有空的反向引用
C#中是否有等效项或其他解决方法?应该可以concat backref1和backref2。
因为其中一个始终为空,而concat with empty的字符串仍然是同一个字符串 使用您的正则表达式
(?:(Sat)ur|(Sun))day
和替换$1$2
您将获得
周六的Sat
和周日的Sun
regex (?:(Sat)ur|(Sun))day
input | backref1 _$1_ | backref2 _$2_ | 'concat' _$1$2_
---------|---------------|---------------|----------------
Saturday | 'Sat' | '' | 'Sat'+'' = Sat
Sunday | '' | 'Sun' | ''+'Sun' = Sun
regex(?(星期六)ur |(星期日))日
输入| backref1 124;$1 124; backref2 124;$2 124; concat 124;$1$2_
---------|---------------|---------------|----------------
星期六|“星期六”|“星期六”+“”=星期六
星期日| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
与读取backref1或backref2不同的是,只读取结果和concat结果。.NET不支持分支重置操作符,但它支持命名组,并且它允许您无限制地重用组名(AFAIK,这是其他风格所不支持的)。所以你可以用这个:
(?:(?<abbr>Sat)ur|(?<abbr>Sun))day
(?:(?Sat)ur|(?Sun))日
…并且缩写名称将存储在Match.Groups[“abbr”]
中。您可以使用分支重置操作符:
(?|foo(bar)|still(life)|(like)so)
无论哪个分支匹配,这只会设置第一组。您可以使用(?:(Sat(?=ur)| Sun(?!ur))(?:ur)?)day来代替。
。)@秋葵为什么太阳后面没有“你”?正则表达式有点复杂…否则,Sunurday
可能会匹配。这有点像我犯的错误(你指出了:),否则它也会匹配Sunurday。Perl允许以相同的模式重用命名组。没有限制。这还允许您获取匹配的命名组列表。使用PCRE,您可以使用(?J)
修饰符(必须放置在模式中的第一个位置),该修饰符允许使用具有相同名称的命名组。(这是一个一劳永逸的选项,以后不能取消设置)。这个答案已添加到“组”下的。Python允许重用组名,但当然它也知道运算符。我更喜欢直接获得结果,而不需要对输入字符串进行任何操作(如分支重置运算符)。@Stephan我不明白你的评论?我想我没有对输入字符串进行操作。我刚刚指出,您可以从正则表达式结果中解析group1和group2,而不需要对正则表达式进行任何更改。@bwüezi您可以用详细的示例代码编辑您的答案,因为我仍然不理解您的解决方案。+1这似乎比让正则表达式变得更复杂以便一次返回所需的值要好得多参考。@juharr感谢您理解我的解决方案;-)在这里,我认为StackOverflow是在答案中寻找质量而不是数量的地方。