【问题标题】:Use named regex groups to shorten the pattern使用命名的正则表达式组来缩短模式
【发布时间】:2019-08-23 07:39:17
【问题描述】:

我正在尝试在正则表达式中使用命名组来减小正则表达式的大小。然而,即使是最简单的形式,在清除所有“噪音”之后,我也无法让它工作。

当我尝试 regex101 文档中的示例时,它可以工作。

/(?<first>a+) and again (\k<first>)/

这是我最简单的例子,但它不起作用。

(?<months>December)|^(next)\s(\k<months>)

这里是输入“next”不匹配。

next December
December 2020  

我希望“下一个十二月”匹配第一行,但它只匹配两行中的“十二月”。

你可以在这里找到正则表达式https://regex101.com/r/aEgfe8/3/

文档只提到命名组必须在左侧。

我错过了什么?

【问题讨论】:

    标签: regex


    【解决方案1】:

    您应该使用(?P&gt;months)(?P&gt;months) 而不是\k&lt;months&gt;

    (?<months>December)|^(next)\s((?&months))
                                  ^^^^^^^^^^ 
    (?<months>December)|^(next)\s((?P>months))
                                  ^^^^^^^^^^^ 
    

    regex demo

    \k&lt;first&gt; 是一个命名的反向引用,它只匹配匹配的文本。由于(?&lt;months&gt;December)在另一个分支中不匹配,所以反向引用为空。

    要在一个正则表达式中递归、重用部分模式,您需要使用正则表达式命名的子例程,语法为(?&amp;NAME)

    Regular Expression Subroutines查看更多详情:

    Perl 使用(?1) 调用一个编号组,(?+1) 调用下一个组,(?-1) 调用前一个组,(?&amp;name) 调用一个命名组。您可以使用所有这些来引用同一组。 (?+1)(?'name'[abc])(?1)(?-1)(?&amp;name) 匹配一个长度为五个字母且仅包含第一个字母的字符串。

    在 C# 中,不支持正则表达式子例程。只需重复子模式:

    var rep = "December";
    var ThePattern = $@"(?<months>{rep})|^(next)\s({rep})";
    

    pattern will look like(?&lt;months&gt;December)|^(next)\s(December)

    有关重用正则表达式部分问题的相关链接

    【讨论】:

    • 谢谢@wiktor-stribiżew,这绝对有帮助。不幸的是,该语法在 C# 中不起作用。有什么想法吗?
    • @SafwanHak 为什么不从一开始就添加正确的标签? .NET 根本不支持递归/正则表达式子例程。
    • 我以为是我对正则表达式的误解和对 \k 的误用。只有在您提出建议后,C# 问题才出现。
    猜你喜欢
    • 2017-08-11
    • 2020-01-09
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2021-08-08
    • 1970-01-01
    相关资源
    最近更新 更多