正则表达式中的命名捕获

Named capture in regexp

我需要能够使用 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"  

我可以看出这是什么问题了,因为这段代码和网页的代码很相似。

提前致谢

如果要在 PCRE 正则表达式格式中制作白色space,只需使用 (?x) 内联修饰符:

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

R online demo

如果你想用这个修饰符匹配文字 space,你将不得不转义它,或者在字符 class 中使用。如果需要匹配任何白色space,使用\s shorthand.

如果您不需要所有这些 "prettifying" 东西,只需从您的模式中删除 space,因为没有 (?x) 它们是有意义的:

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

注意文字 # 符号也必须转义以表示文字 # 符号。 此外,whitespace inside character classes ([...]) 被视为文字 whitespace 并且您可以在 PCRE 正则表达式模式中使用 (?#:...) 注释(?x) 修饰符。