[英]Regular expression in R: gsub pattern
我正在學習R的正則表達式,我無法理解這個gsub
示例:
gsub("([.|()\\^{}+$*?]|\\[|\\])", "\\\\\\1", 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.