我想匹配一个正则表达式特殊字符,\^$.?*|+()[{.我试过了:
x <- "a[b"
grepl("[", x)
## Error: invalid regular expression '[', reason 'Missing ']''
Run Code Online (Sandbox Code Playgroud)
(等价stringr::str_detect(x, "[")或stringi::stri_detect_regex(x, "[").)
将值加倍以逃避它不起作用:
grepl("[[", x)
## Error: invalid regular expression '[[', reason 'Missing ']''
Run Code Online (Sandbox Code Playgroud)
也没有使用反斜杠:
grepl("\[", x)
## Error: '\[' is an unrecognized escape in character string starting ""\["
Run Code Online (Sandbox Code Playgroud)
我如何匹配特殊字符?
这个问题的一些特殊情况是陈旧的,写得足够好,因为它可以像这样重复关闭:
在R正则表达式中逃脱的时期
如何逃避R中的问号?
在正则表达式中转义管道("|")
Ric*_*ton 91
R将反斜杠视为字符常量的转义值.(...然后是正则表达式.因此在为模式提供字符参数时需要两个反斜杠.第一个实际上不是一个字符,而是将第二个变成一个字符.)你可以看到如何处理它们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: €
Run Code Online (Sandbox Code Playgroud)
进一步阅读:在R中用反斜杠转义反斜杠会在字符串中产生2个反斜杠,而不是1
要在正则表达式中使用特殊字符的最简单的方法通常用反斜线转义,但正如上面提到,反斜杠本身也需要进行转义.
grepl("\\[", "a[b")
## [1] TRUE
Run Code Online (Sandbox Code Playgroud)
要匹配反斜杠,您需要双重转义,从而产生四个反斜杠.
grepl("\\\\", c("a\\b", "a\nb"))
## [1] TRUE FALSE
Run Code Online (Sandbox Code Playgroud)
该rebus软件包包含每个特殊字符的常量,以保存错误输入斜杠.
library(rebus)
OPEN_BRACKET
## [1] "\\["
BACKSLASH
## [1] "\\\\"
Run Code Online (Sandbox Code Playgroud)
有关更多示例,请参阅
?SpecialCharacters
Run Code Online (Sandbox Code Playgroud)
您的问题可以通过这种方式解决:
library(rebus)
grepl(OPEN_BRACKET, "a[b")
Run Code Online (Sandbox Code Playgroud)
grepl("[?]", "a?b")
## [1] TRUE
Run Code Online (Sandbox Code Playgroud)
两个特殊字符在字符类中具有特殊含义:\和^.
即使反斜杠位于字符类中,仍然需要对其进行转义.
grepl("[\\\\]", c("a\\b", "a\nb"))
## [1] TRUE FALSE
Run Code Online (Sandbox Code Playgroud)
如果直接在开口方括号之后,只需要将护套脱掉.
grepl("[ ^]", "a^b") # matches spaces as well.
## [1] TRUE
grepl("[\\^]", "a^b")
## [1] TRUE
Run Code Online (Sandbox Code Playgroud)
rebus 还可以让你形成一个角色类.
char_class("?")
## <regex> [?]
Run Code Online (Sandbox Code Playgroud)
如果要匹配所有标点符号,可以使用[:punct:]字符类.
grepl("[[:punct:]]", c("//", "[", "(", "{", "?", "^", "$"))
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
Run Code Online (Sandbox Code Playgroud)
stringi 将其映射到Unicode常规类别以进行标点符号,因此其行为略有不同.
stri_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "[[:punct:]]")
## [1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
您还可以使用跨平台语法来访问UGC.
stri_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "\\p{P}")
## [1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
配售之间的字符\\Q,并\\E使得正则表达式引擎对待他们从字面上看,而不是正则表达式.
grepl("\\Q.\\E", "a.b")
## [1] TRUE
Run Code Online (Sandbox Code Playgroud)
rebus 让你编写正则表达式的文字块.
literal(".")
## <regex> \Q.\E
Run Code Online (Sandbox Code Playgroud)
正则表达式并不总是答案.如果你想匹配一个固定的字符串,那么你可以这样做,例如:
grepl("[", "a[b", fixed = TRUE)
stringr::str_detect("a[b", fixed("["))
stringi::stri_detect_fixed("a[b", "[")
Run Code Online (Sandbox Code Playgroud)