C# 中 php(pcre) 中的分支重置运算符 (“?|”) 相当于什么?

发布于 2024-10-24 23:43:27 字数 253 浏览 2 评论 0原文

以下正则表达式将匹配“Saturday”或“Sunday”:(?:(Sat)ur|(Sun))day

但在一种情况下,反向引用 1 被填充,而反向引用 2 为空,并且在其他情况反之亦然。

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

C# 中是否有等效项或某种解决方法?

The following regular expression will match "Saturday" or "Sunday" : (?:(Sat)ur|(Sun))day

But in one case backreference 1 is filled while backreference 2 is empty and in the other case vice-versa.

PHP (pcre) provides a nice operator "?|" that circumvents this problem. The previous regex would become (?|(Sat)ur|(Sun))day. So there will not be empty backreferences.

Is there an equivalent in C# or some workaround ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

难忘№最初的完美 2024-10-31 23:43:27

.NET 不支持分支重置运算符,但它支持命名组,并且它允许您不受限制地重用组名称(据我所知,其他风格没有这样做)。所以你可以使用这个:

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

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

.NET doesn't support the branch-reset operator, but it does support named groups, and it lets you reuse group names without restriction (something no other flavor does, AFAIK). So you could use this:

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

...and the abbreviated name will be stored in Match.Groups["abbr"].

巾帼英雄 2024-10-31 23:43:27

应该可以连接 backref1 和 backref2。
因为每个都始终为空,并且与空连接的字符串仍然是相同的字符串...

使用您的正则表达式 (?:(Sat)ur|(Sun) )day 和替换 $1$2
SaturdaySatSun代码>周日。

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

无需读取 backref1 或 backref2,只需读取两个结果并连接结果。

should be possible to concat backref1 and backref2.
As one of each is always empty and a string concat with empty is still the same string...

with your regex (?:(Sat)ur|(Sun))day and replacement $1$2
you get Sat for Saturday and Sun for Sunday.

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

instead of reading backref1 or backref2 just read both results and concat the result.

纵山崖 2024-10-31 23:43:27

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

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

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

You can use the branch-reset operator:

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

That will only set group one no matter which branch matches.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文