在R中,传统的做法是使用两个斜杠来在正则表达式中使用元字符,例如(变成\(,但我发现对于方括号却不是这样。
mystring <- "abc[de"
#remove [,] and $ characters
gsub("[\\[\\]$]","",mystring)
[1] "abc[de"
[[:punct:]]
能够工作,但如果没有必要,我不想使用非标准的正则表达式。是否可以使用正则表达式集语法?
我建议避开使用 [ab]
语法,而是使用 (a|b)
。除了能够正常工作外,这种写法还更易读:
gsub("(\\[|\\]|\\$)","",mystring)
perl = TRUE
,这样你就可以使用类似Perl的语法,更加直观易懂(在我看来)。gsub("[\\[\\]$]","",mystring, perl = TRUE)
]
时,您可以使用“智能放置”(在其中[
不是特殊字符,因此不需要转义[
):gsub("[][$]","",mystring)
查看 演示
结果:
[1] "abcde"
更多细节
[...]
结构被 TRE 正则表达式引擎视为 括号表达式(在不使用 perl=TRUE
时默认用于基础 R 正则表达式函数 - (g)sub、grep(l)、(g)regexpr - ),这是 POSIX 正则表达式结构。与 NFA 正则表达式引擎中的 字符类 不同,括号表达式不支持 转义序列,即其中的 \
字符被视为字面反斜杠字符。
[\[\]]
匹配\
或[
字符(其中[\[\]
部分实际上等于[\[]
),然后是]
。因此,它匹配\]
或[]
子字符串,请看gsub("[\\[\\]]", "", "[]\\]ab]")
demo - 它输出ab]
,因为[]
和\]
被匹配并最终被移除。perl = TRUE
。 - Alex A.如果你只是想匹配\\[
,那么不需要加上额外的方括号,除非你要匹配多个选项:
> mystring <- 'abc[de'
> gsub("\\[", "", mystring)
[1] "abcde"
如果您使用fixed=TRUE
,可以去除单个字符的特殊含义,使其更加简单且快速:
> mystring <- 'abc[de'
> gsub("[", "", mystring, fixed=TRUE)
[1] "abcde"
或者,如果方括号内的第一件事是方括号(未转义),则它们被视为字面字符,而不是具有通常特殊含义:
> mystring <- 'a,bc[d]e$'
> gsub("[][,$]", "", mystring)
[1] "abcde"
][$
实际上在原始帖子中)。 - Frank
gsub("(\\[|\\]|\\$)","",mystring)
呢?这仍然是标准的正则表达式,对吧? - Frank|\\$
来完整匹配 OP 的示例。无论如何,将其发布为答案,你就可以得到一个赞了。 - Alex A.