在regexp

时间:2016-09-06 13:41:54

标签: regex r regex-group capturing-group

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

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

提前致谢

1 个答案:

答案 0 :(得分:2)

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

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

请参阅R online demo

如果要将文字空间与此修饰符匹配,则必须将其转义,或在字符类中使用。如果您需要匹配任何空格,请使用\s简写。

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

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

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