我想匹配一个正则表达式特殊字符,\^$.?*|+()[{
。我试过了:
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 ""\["
我如何匹配特殊字符?
这个问题的一些特殊情况是陈旧的,写得足够好,因为它可以像这样重复关闭: 在R正则表达式中逃脱的时期 如何逃避R中的问号? 在正则表达式中转义管道(“|”)
发布于 2019-03-04 13:32:14
我认为匹配字符的最简单方法就像
\^$.?*|+()[
正在使用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
发布于 2019-03-04 13:39:29
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: €
进一步阅读:在R中用反斜杠转义反斜杠会在字符串中产生2个反斜杠,而不是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")
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
使得正则表达式引擎对待他们从字面上看,而不是正则表达式。
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", "[")
https://stackoverflow.com/questions/-100005162
复制相似问题