正则表达式中的命名捕获组

Posted

技术标签:

【中文标题】正则表达式中的命名捕获组【英文标题】:named capture group in regex 【发布时间】:2011-10-26 18:12:22 【问题描述】:

我需要正则表达式的帮助来从以下字符串中捕获数字和连字符: “一些文字和东西 200-1234EM 一些其他东西”

它也可以不带连字符的部分出现: "一些文字 123EM 其他文字"

我需要命名捕获组中的“200-1234”或“123”。

我试过这个: \b([0-9]0,3\-0,1[0-9]3)EM\b

确实匹配,但不是命名组。

当我尝试这样命名组时: \b(?<test>[0-9]0,3\-0,1[0-9]3)EM\b 我收到一条错误消息“索引 34 附近的未知后视组”

我需要它在 .NET RegEx 类中工作

谢谢!

【问题讨论】:

你在哪里测试这个?虽然正则表达式不正确(请参阅@FailedDev 的正确答案),但命名组语法对于 .NET 是正确的。 对我来说也是如此,在 regex-tester 中使用 wwww.regexlib.com 上的 silverlight 测试器 你确定它失败的是同一个正则表达式吗?您的正则表达式没有后视。 @Alan:我使用了一些基于 Java 的愚蠢在线测试器,因此存在命名问题。感谢 regexlib.com 的提示,他们的 silverlight 测试仪很好 【参考方案1】:
resultString = Regex.Match(subjectString, @"\b(?<number>\d+(?:-\d+)?)EM\b").Groups["number"].Value;

这应该可以解决问题。如果您提供更多输入,我可以使它更健壮。

说明:

    @"
\b            # Assert position at a word boundary
(?<number>    # Match the regular expression below and capture its match into backreference with name “number”
   \d            # Match a single digit 0..9
      +             # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
   (?:           # Match the regular expression below
      -             # Match the character “-” literally
      \d            # Match a single digit 0..9
         +             # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
   )?            # Between zero and one times, as many times as possible, giving back as needed (greedy)
)
EM            # Match the characters “EM” literally
\b            # Assert position at a word boundary
"

【讨论】:

以上是关于正则表达式中的命名捕获组的主要内容,如果未能解决你的问题,请参考以下文章

Java 正则表达式之捕获组

R中的正则表达式命名组

正则表达式进阶

如何仅对一个命名捕获组执行正则表达式替换?

使用 re.findall 在正则表达式中捕获命名组

在 Ruby gsub 块中使用命名的捕获组(正则表达式)