我如何处理特殊字符像\ ^ $。?* | +()[{在我的正则expression式?

我想匹配正则expression式特殊字符 \^$.?*|+()[{ 。 我试过了:

 x <- "a[b" grepl("[", x) ## Error: invalid regular expression '[', reason 'Missing ']'' 

(相当于stringr::str_detect(x, "[")或者stringi::stri_detect_regex(x, "[") 。)

加倍的价值逃脱它不起作用:

 grepl("[[", x) ## Error: invalid regular expression '[[', reason 'Missing ']'' 

也不使用反斜杠:

 grepl("\[", x) ## Error: '\[' is an unrecognized escape in character string starting ""\[" 

我如何匹配特殊字符?


一些特殊情况下,这个问题是旧的,写得足够好,因为它是厚颜无耻的closures作为重复:
R正则expression式中的转义期
如何在R中跳出一个问号?
在正则expression式中转义pipe道(“|”)

用双反斜杠逃脱

R将反斜杠视为字符常量的转义值。 (…所以正则expression式也是如此,因此在为模式提供字符参数时需要两个反斜杠,第一个实际上不是一个字符,而是第二个字符变成一个字符)。他们如何使用cat进行处理。

 y <- "double quote: \", tab: \t, newline: \n, unicode point: \u20AC" print(y) ## [1] "double quote: \", tab: \t, newline: \n, unicode point: €" cat(y) ## double quote: ", tab: , newline: ## , unicode point: € 

进一步阅读: 用R中的反斜杠转义反斜杠会在string中产生2个反斜杠,而不是1

要在正则expression式中使用特殊字符,最简单的方法通常是用一个反斜杠来转义它们,但是如上所述,反斜杠本身需要被转义。

 grepl("\\[", "a[b") ## [1] TRUE 

要匹配反斜杠,你需要加倍逃脱,导致四个反斜杠。

 grepl("\\\\", c("a\\b", "a\nb")) ## [1] TRUE FALSE 

rebus软件包包含每个特殊字符的常量,可以帮助您避免input错误的斜线。

 library(rebus) OPEN_BRACKET ## [1] "\\[" BACKSLASH ## [1] "\\\\" 

形成一个人物类

您还可以将特殊字符包裹在方括号中以形成一个字符类 。

 grepl("[?]", "a?b") ## [1] TRUE 

两个特殊字符在字符类中有特殊含义: \^

即使在字符类中,反斜杠仍然需要被转义。

 grepl("[\\\\]", c("a\\b", "a\nb")) ## [1] TRUE FALSE 

脱字符只需要在方括号之后直接转义即可。

 grepl("[ ^]", "a^b") # matches spaces as well. ## [1] TRUE grepl("[\\^]", "a^b") ## [1] TRUE 

rebus也可以让你形成一个angular色类。

 char_class("?") ## <regex> [?] 

使用预先存在的字符类

如果要匹配所有标点符号,可以使用[:punct:]字符类。

 grepl("[[:punct:]]", c("//", "[", "(", "{", "?", "^", "$")) ## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE 

stringi将其映射到Unicode常规类别的标点符号,因此其行为稍有不同。

 stri_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "[[:punct:]]") ## [1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE 

您也可以使用跨平台语法访问UGC。

 stri_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "\\p{P}") ## [1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE 

使用\ Q \ E逃脱

\\Q\\E之间放置字符使得正则expression式引擎将字面处理而不是正则expression式。

 grepl("\\Q.\\E", "ab") ## [1] TRUE 

rebus让你写正则expression式的文字块。

 literal(".") ## <regex> \Q.\E 

不要使用正则expression式

正则expression式并不总是答案。 如果你想匹配一个固定的string,那么你可以做,例如:

 grepl("[", "a[b", fixed = TRUE) stringr::str_detect("a[b", fixed("[")) stringi::stri_detect_fixed("a[b", "[") 

我认为最简单的方法来匹配字符

 \^$.?*|+()[ 

正在使用R中的字符类。请考虑以下内容来清除数据文件中可能包含空格和标点符号的列标题:

 > library(stringr) > colnames(order_table) <- str_replace_all(colnames(order_table),"[:punct:]|[:space:]","") 

这种方法允许我们对字符类进行string匹配以匹配标点符号,除了空格字符之外,通常必须用\\来检测。 你可以在下面的这个cheatsheet上了解更多关于angular色类的知识,你也可以input?regexp来查看更多关于这个的信息。

https://www.rstudio.com/wp-content/uploads/2016/09/RegExCheatsheet.pdf