2016-09-06 60 views
2

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

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

在此先感谢

+0

那么究竟是什么问题呢?我在输出中看到捕获的名称。看起来你的正则表达式中有空格,但不在目标中。这是“问题”吗? – MrFlick

+1

在模式开始处添加'(?x)'或从模式中删除空格。 –

回答

2

如果你想在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})" 

注意字面#符号也必须逃出来表示文字#符号。 此外,字符类内部的空格([...])被视为文字空格,并且您可以在PCRE正则表达式模式中使用(?#:...)注释和(?x)修饰符。