用双反斜杠转义
R将反斜杠视为字符常量的转义值。(...正则表达式也是如此。因此,为模式提供字符参数时,需要两个反斜杠。第一个实际上不是字符,而是使第二个变成字符。)您可以看到如何使用cat
。
y <- "double quote: \", tab: \t, newline: \n, unicode point: \u20AC"
print(y)
cat(y)
进一步阅读:在R中使用反斜杠转义一个反斜杠会在字符串中产生2个反斜杠,而不是1
要在正则表达式中使用特殊字符,最简单的方法通常是使用反斜杠对其进行转义,但是如上所述,反斜杠本身需要进行转义。
grepl("\\[", "a[b")
要匹配反斜杠,您需要两次转义,以产生四个反斜杠。
grepl("\\\\", c("a\\b", "a\nb"))
该rebus
软件包包含每个特殊字符的常量,以免您误用斜杠。
library(rebus)
OPEN_BRACKET
BACKSLASH
有关更多示例,请参见:
?SpecialCharacters
您的问题可以通过以下方式解决:
library(rebus)
grepl(OPEN_BRACKET, "a[b")
形成角色类
您也可以将特殊字符包装在方括号中以形成字符类。
grepl("[?]", "a?b")
其中两个特殊字符在字符类中具有特殊含义:\
和^
。
即使在字符类中,反斜杠仍然需要转义。
grepl("[\\\\]", c("a\\b", "a\nb"))
仅在插入方括号后方时才需要插入脱字号。
grepl("[ ^]", "a^b")
grepl("[\\^]", "a^b")
rebus
还可以让您形成一个角色类。
char_class("?")
使用预先存在的角色类
如果要匹配所有标点符号,则可以使用[:punct:]
字符类。
grepl("[[:punct:]]", c("//", "[", "(", "{", "?", "^", "$"))
stringi
将其映射到Unicode通用类别进行标点,因此其行为略有不同。
stri_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "[[:punct:]]")
您也可以使用跨平台语法来访问UGC。
stri_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "\\p{P}")
使用\ Q \ E转义
将字符放在\\Q
和之间,\\E
使正则表达式引擎按字面意义而不是将其视为正则表达式。
grepl("\\Q.\\E", "a.b")
rebus
使您可以编写正则表达式的文字块。
literal(".")
不要使用正则表达式
正则表达式并不总是答案。如果要匹配固定的字符串,则可以这样做,例如:
grepl("[", "a[b", fixed = TRUE)
stringr::str_detect("a[b", fixed("["))
stringi::stri_detect_fixed("a[b", "[")
cat
看反斜杠被照亮逃逸的效果。