2013-02-12 103 views
15

我想構建一個正則表達式替換某些字符串來搜索,所以這些字符串需要先被轉義,然後才能將它們放入正則表達式中,所以如果搜索到的字符串包含正則表達式字符,它仍然有效。是否有R函數來轉義正則表達式字符的字符串

某些語言具有可以爲您執行此操作的功能(例如python re.escapehttps://stackoverflow.com/a/10013356/1900520)。 R有這樣的功能嗎?

例如(由函數):

x = "foo[bar]" 
y = escape(x) # y should now be "foo\\[bar\\]" 
+0

你可以添加一個示例字符串,你想要輸出看起來像什麼? – 2013-02-12 16:13:11

+3

大多數正則表達式函數都有一個名爲'fixed'的參數,如果設置爲TRUE,則會使模式按原樣匹配。 – Dason 2013-02-12 17:09:06

+0

這並不好 - 我想從用戶提供的輸入中構建一個正則表達式,所以我需要「消毒」輸入,但仍然使用正則表達式。 – Corone 2013-02-12 17:12:03

回答

13

我寫Perl的quotemeta功能的R版本:

library(stringr) 
quotemeta <- function(string) { 
    str_replace_all(string, "(\\W)", "\\\\\\1") 
} 

我總是使用正則表達式的perl的味道,所以這對我的作品。我不知道它是否適用於R中的「正常」正則表達式。

編輯:我找到了解釋其原因的源代碼。它在Quoting Metacharacters section of the perlre manpage

這一個常見的成語曾經用來關閉或引用中要使用的模式字符串的正則表達式元字符的特殊含義。簡單地引用所有非「字」字:

$pattern =~ s/(\W)/\\$1/g; 

正如你所看到的R上面的代碼是此相同的替代的直接轉換(通過反斜槓地獄之旅後)。該手冊頁也說(重點煤礦):

與其他一些正則表達式語言,有沒有不屬於字母數字符號反斜槓。

這強化了我的觀點,即該解決方案只能保證PCRE。

+0

你應該注意到你正在使用stringr – Dason 2013-02-12 18:02:51

+0

哎呀,是的,我忘記了! – 2013-02-12 20:21:50

6

顯然有一個在Hmisc包稱爲escapeRegex功能。該功能本身具有以下定義爲「串」的輸入值:

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

我以前的答案:

我不知道是否有一個內置的功能,但你可以做一做你想要什麼。這基本上只是創建一個你想要替換的值的向量和一個你想要替換的向量,然後通過那些進行必要的替換循環。

re.escape <- function(strings){ 
    vals <- c("\\\\", "\\[", "\\]", "\\(", "\\)", 
       "\\{", "\\}", "\\^", "\\$","\\*", 
       "\\+", "\\?", "\\.", "\\|") 
    replace.vals <- paste0("\\\\", vals) 
    for(i in seq_along(vals)){ 
     strings <- gsub(vals[i], replace.vals[i], strings) 
    } 
    strings 
} 

一些輸出

> test.strings <- c("What the $^&(){}.*|?", "foo[bar]") 
> re.escape(test.strings) 
[1] "What the \\$\\^&\\(\\)\\{\\}\\.\\*\\|\\?" 
[2] "foo\\[bar\\]" 
+0

這不是一個好的解決方案。你必須在'vals'中包含每一個特殊的正則表達式字符,這可能會變得困難。 – 2013-02-12 20:23:25

+0

@RyanThompson當然 - 但這是一個開始。而特殊字符的列表是有限的,所以它不是一個非常巨大的負擔。我並不是說這是一個最佳的解決方案 - 只是這是一種可能性。另外請注意,您的方法可能會轉義通常不被視爲正則表達式字符的字符,因此也可能被視爲「不良」字符。 – Dason 2013-02-12 21:54:52

+1

我的方法可能會轉義某些不需要轉義的字符,但這樣做不會受到傷害,因爲對於PCRE * *任何*非字母數字字符在被反斜線加上前綴時都被視爲文字,即使反斜槓是不需要。 – 2013-02-12 22:12:37

相關問題