正则表达式中的命名捕获
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})"
^^^^
如果你想用这个修饰符匹配文字 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)
修饰符。
我需要能够使用 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})"
^^^^
如果你想用这个修饰符匹配文字 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)
修饰符。