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

时间:2014-12-31 12:15:39

标签: regex r r-faq

我想匹配regular expression special character\^$.?*|+()[{。我试过了:

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 ""\["

如何匹配特殊字符?


这个问题的一些特殊情况是陈旧的,写得很好,因为它是厚颜无耻的关闭,因为它的重复:
Escaped Periods In R Regular Expressions
How to escape a question mark in R?
escaping pipe ("|") in a regex

2 个答案:

答案 0 :(得分:79)

以双反斜杠逃生

R将反斜杠视为character constants的转义值。 (...然后是正则表达式。因此在为模式提供字符参数时需要两个反斜杠。第一个实际上不是一个字符,而是将第二个变成一个字符。)你可以看到如何使用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: €

进一步阅读:Escaping a backslash with a backslash in R produces 2 backslashes in a string, not 1

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

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

要匹配反斜杠,您需要双重转义,从而产生四个反斜杠。

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

rebus包中包含每个特殊字符的常量,以保存错误输入斜杠。

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

有关更多示例,请参阅:

?SpecialCharacters

您的问题可以通过这种方式解决:

library(rebus)
grepl(OPEN_BRACKET, "a[b")

形成一个角色类

You can also wrap the special characters in square brackets to form a character class

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也可以让你形成一个角色类。

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之间放置字符会使正则表达式引擎按字面意思处理它们而不是正则表达式。

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

rebus允许您编写正则表达式的文字块。

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

不要使用正则表达式

正则表达式并不总是答案。如果你想匹配一个固定的字符串,那么你可以这样做,例如:

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

答案 1 :(得分:1)

我认为匹配

等字符的最简单方法
\^$.?*|+()[

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

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

这种方法允许我们将字符串字符串与字符串字符进行匹配,除了空格字符之外,通常需要通过\\来检索。您可以在下面的备忘单中了解有关角色类的更多信息,还可以输入?regexp以查看有关此内容的更多信息。

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