首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我如何处理特殊字符,如\ ^ $。?* | +()[{在我的正则表达式?

我如何处理特殊字符,如\ ^ $。?* | +()[{在我的正则表达式?
EN

Stack Overflow用户
提问于 2019-03-04 04:39:09
回答 2查看 0关注 0票数 0

我想匹配一个正则表达式特殊字符\^$.?*|+()[{。我试过了:

代码语言:javascript
复制
x <- "a[b"
grepl("[", x)
## Error: invalid regular expression '[', reason 'Missing ']''

(等价于stringr::str_detect(x, "[")stringi::stri_detect_regex(x, "[")。)

将值加倍以逃避它不起作用:

代码语言:javascript
复制
grepl("[[", x)
## Error: invalid regular expression '[[', reason 'Missing ']''

也没有使用反斜杠:

代码语言:javascript
复制
grepl("\[", x)
## Error: '\[' is an unrecognized escape in character string starting ""\["

我如何匹配特殊字符?

这个问题的一些特殊情况是陈旧的,写得足够好,因为它可以像这样重复关闭: 在R正则表达式中逃脱的时期 如何逃避R中的问号? 在正则表达式中转义管道(“|”)

EN

回答 2

Stack Overflow用户

发布于 2019-03-04 13:32:14

我认为匹配字符的最简单方法就像

代码语言:javascript
复制
\^$.?*|+()[

正在使用R中的字符类。请考虑以下内容从数据文件中清除列标题,该文件可能包含空格和标点字符:

代码语言:javascript
复制
> 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

票数 0
EN

Stack Overflow用户

发布于 2019-03-04 13:39:29

用双反斜杠逃脱

R将反斜杠视为字符常量的转义值。(...然后是正则表达式。因此在为模式提供字符参数时需要两个反斜杠。第一个实际上不是一个字符,而是将第二个变成一个字符。)你可以看到如何处理它们cat

代码语言:javascript
复制
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

要在正则表达式中使用特殊字符,最简单的方法通常是使用反斜杠来转义它们,但如上所述,反斜杠本身需要进行转义。

代码语言:javascript
复制
grepl("\\[", "a[b")
## [1] TRUE

要匹配反斜杠,您需要双重转义,从而产生四个反斜杠。

代码语言:javascript
复制
grepl("\\\\", c("a\\b", "a\nb"))
## [1]  TRUE FALSE

rebus软件包包含每个特殊字符的常量,以保存错误输入斜杠。

代码语言:javascript
复制
library(rebus)
OPEN_BRACKET
## [1] "\\["
BACKSLASH
## [1] "\\\\"

有关更多示例,请参阅

代码语言:javascript
复制
?SpecialCharacters

您的问题可以通过这种方式解决:

代码语言:javascript
复制
library(rebus)
grepl(OPEN_BRACKET, "a[b")

形成一个角色类

您还可以将特殊字符包装在方括号中以形成字符类

代码语言:javascript
复制
grepl("[?]", "a?b")
## [1] TRUE

两个特殊字符在字符类中具有特殊含义:\^

即使反斜杠位于字符类中,仍然需要对其进行转义。

代码语言:javascript
复制
grepl("[\\\\]", c("a\\b", "a\nb"))
## [1]  TRUE FALSE

如果直接在开口方括号之后,只需要将护套脱掉。

代码语言:javascript
复制
grepl("[ ^]", "a^b")  # matches spaces as well.
## [1] TRUE
grepl("[\\^]", "a^b") 
## [1] TRUE

rebus 还可以让你形成一个角色类。

代码语言:javascript
复制
char_class("?")
## <regex> [?]

使用预先存在的字符类

如果要匹配所有标点符号,可以使用[:punct:]字符类。

代码语言:javascript
复制
grepl("[[:punct:]]", c("//", "[", "(", "{", "?", "^", "$"))
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE

stringi 将其映射到Unicode常规类别以进行标点符号,因此其行为略有不同。

代码语言:javascript
复制
stri_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "[[:punct:]]")
## [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE

您还可以使用跨平台语法来访问UGC。

代码语言:javascript
复制
stri_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "\\p{P}")
## [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE

使用\ Q \ E转义

配售之间的字符\\Q,并\\E使得正则表达式引擎对待他们从字面上看,而不是正则表达式。

代码语言:javascript
复制
grepl("\\Q.\\E", "a.b")
## [1] TRUE

rebus 让你编写正则表达式的文字块。

代码语言:javascript
复制
literal(".")
## <regex> \Q.\E

不要使用正则表达式

正则表达式并不总是答案。如果你想匹配一个固定的字符串,那么你可以这样做,例如:

代码语言:javascript
复制
grepl("[", "a[b", fixed = TRUE)
stringr::str_detect("a[b", fixed("["))
stringi::stri_detect_fixed("a[b", "[")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100005162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档