2013-02-12 67 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

相关问题