使用双反斜杠转义
R 将反斜杠视为转义值字符常量 http://www.inside-r.org/r-doc/base/Quotes。 (...正则表达式也是如此。因此,在为模式提供字符参数时需要两个反斜杠。第一个反斜杠实际上不是字符,而是使第二个反斜杠成为字符。)您可以看到如何使用它们进行处理cat http://www.inside-r.org/r-doc/base/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 中使用反斜杠转义反斜杠会在字符串中产生 2 个反斜杠,而不是 1 个 https://stackoverflow.com/questions/26284507/escaping-a-backslash-with-a-backslash-in-r-produces-2-backslashes-in-a-string-n
要在正则表达式中使用特殊字符,最简单的方法通常是使用反斜杠对其进行转义,但如上所述,反斜杠本身需要进行转义。
grepl("\\[", "a[b")
## [1] TRUE
要匹配反斜杠,您需要双重转义,从而产生四个反斜杠。
grepl("\\\\", c("a\\b", "a\nb"))
## [1] TRUE FALSE
The rebus
包包含每个特殊字符的常量,以防止您误输入斜杠。
library(rebus)
OPEN_BRACKET
## [1] "\\["
BACKSLASH
## [1] "\\\\"
更多示例请参见:
?SpecialCharacters
您的问题可以这样解决:
library(rebus)
grepl(OPEN_BRACKET, "a[b")
形成一个字符类
您还可以将特殊字符括在方括号中以形成字符类 http://www.regular-expressions.info/charclass.html.
grepl("[?]", "a?b")
## [1] TRUE
其中两个特殊字符在字符类中具有特殊含义:\
and ^
.
即使反斜杠位于字符类内部,仍然需要转义。
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
and \\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", "[")