簡體   English   中英

R:gsub模式中的正則表達式

[英]Regular expression in R: gsub pattern

我正在學習R的正則表達式,我無法理解這個gsub示例:

gsub("([.|()\\^{}+$*?]|\\[|\\])", "\\\\\\1", x)

到目前為止,我認為我得到:

  • 如果x是字母數字,則它不匹配,所以沒有任何修改
  • 如果x包含一個. 或者| ({}+$?它在它前面添加\\\\

我無法解釋:

> gsub("([.|()\\^{}+$*?]|\\[|\\])", "\\\\\\1", '10\1')
[1] "10\001"

要么

> gsub("([.|()\\^{}+$*?]|\\[|\\])", "\\\\\\1", '10/1')
[1] "10/1"

我也很困惑為什么替換"\\\\\\\\\\\\1"只添加兩個括號。

我想要弄清楚這個功能是做什么的,我認為這是為了逃避某些特殊字符?

整個模式包含在括號中,允許反向引用。 這部分:

[.|()\\^{}+$*?]

...是一個“字符類”,因此它匹配方括號內的任何一個字符,正如您所說,它正在改變模式語法將解釋模式定義中的元字符的方式。

下一部分是一個“管道”字符,它是正則表達式,然后是一個轉義的開放式方括號,另一個是“OR”管道,然后是一個轉義的緊密方括號。 由於R和正則表達式都使用反斜杠作為轉義符,因此您需要將它們加倍以在模式中獲得R +正則表達式轉義...但不是替換字符串。 如果將close-square-bracket放在字符串中的第一個字符串中,則只能在字符類中輸入,並且整個模式可以更緊湊地形成:

 "[][.|()\\^{}+$*?]"  # without the "|\\[|\\])"

在替換字符串中,形式"\\\\n"指的是與“模式”的第n個括號部分匹配的任何內容,在這種情況下,“1”是替換的第二部分。 第一個位置是“\\”,它形成一個轉義,第二個“\\”形成反斜杠。 現在准備好迎接更奇怪的部分...結果中有多少個字符?

> nchar( gsub("([.|()\\^{}+$*?]|\\[|\\])", "\\\\1", '10\1') )
[1] 3

當然,比賽中的所有項目都不等於'\\ 1'。有人在你之前編寫你所擁有的任何教程(我認為這不是gsub幫助頁面)有一種奇怪的幽默感。這里有一對如果您需要創建否則將被系統readline函數攔截的字符,那么這些函數可能很有用:

> intToUtf8(1)
[1] "\001"
> ?intToUtf8
> 0x0
[1] 0
> intToUtf8(0)
[1] ""
> utf8ToInt("")
integer(0)

並且看一下?Quotes有關R如何處理八進制,十六進制和其他數字以及特殊字符的大量有用信息(在我認為不太可能的標題下)的?Quotes

第一個正則表達式是這個

 (                             # (1 start)
      [.|()\^{}+$*?] 
   |  \[
   |  \]
 )                             # (1 end)

它捕獲'class'或'['或']'中的任何內容然后看起來它用\\\\\\1替換它,這是一個轉義加上捕獲1中的任何東西。

所以,基本上它只是逃避了其中一個字符的單個事件。

正則表達式可以更好地寫為([.|()^{}\\[\\]+$*?])或在
string為"([.|()^{}\\\\[\\\\]+$*?])"

編輯(推廣評論) -

正則表達式將不匹配字符串10 \\ 1所以應該沒有替換。 打印輸出必須有插值(語言)。 看起來它將它轉換為八進制\\ 001。 - 由於它不能顯示二進制1,它顯示其八進制等效值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM