【问题标题】:Named capture in regexp正则表达式中的命名捕获
【发布时间】:2016-09-06 13:41:54
【问题描述】:

我需要使用 r 中的名称在正则表达式中捕获组的能力。我测试了本网站[Rd] Named capture in regexp 中解释的代码,并且该示例可以正常工作。我尝试修改这段代码来解决简单的正则表达式。

(xxxx)(?<id>\w{4})(?<number>\d{5})

更多详情见代码here

我尝试在 r 中做到这一点

regex =  "(xxxx) (?<id>[0-9A-Za-z]{4}) (?<number>[0-9]{5})"
notable = "xxxxcn0700814"
regexpr(regex,notable,perl = TRUE)

这是我对这段代码的输出

[1] -1
attr(,"match.length")
[1] -1
attr(,"useBytes")
[1] TRUE
attr(,"capture.start")
        id number
[1,] -1      -1   -1
attr(,"capture.length")
        id number
[1,] -1      -1   -1
attr(,"capture.names")
[1] ""        "id" "number"  

我可以看出这是什么问题,因为这段代码类似于网页的代码。

提前致谢

【问题讨论】:

  • 那么这里到底有什么问题呢?我在输出中看到捕获的名称。看起来您的正则表达式中有空格,但目标中没有。这就是“问题”吗?
  • 在模式开头添加(?x) 或从模式中删除空格。

标签: regex r regex-group capturing-group


【解决方案1】:

如果您想在 PCRE 正则表达式格式中创建空格,只需使用 (?x) 内联修饰符:

regex =  "(?x)(xxxx) (?<id>[0-9A-Za-z]{4}) (?<number>[0-9]{5})"
          ^^^^

R online demo

如果你想用这个修饰符匹配一个文字空间,你必须将它转义,或者在字符类中使用。如果您需要匹配任何空格,请使用\s 速记。

如果你不需要所有这些“美化”的东西,只需从你的模式中删除空格,因为没有(?x) 它们是有意义的:

regex =  "(xxxx)(?<id>[0-9A-Za-z]{4})(?<number>[0-9]{5})"

注意文字 # 符号也必须转义以表示文字 # 符号。 此外,字符类 ([...]) 中的空白被视为文字空白,您可以在带有 (?x) 修饰符的 PCRE 正则表达式模式中使用(?#:...) cmets。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-17
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2019-05-19
    • 1970-01-01
    相关资源
    最近更新 更多