2016-09-06 25 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)修飾符。