用双反斜杠转义
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", "[")