R中用于匹配方括号的正则表达式

6

在R中,传统的做法是使用两个斜杠来在正则表达式中使用元字符,例如(变成\(,但我发现对于方括号却不是这样。

mystring <- "abc[de"

#remove [,] and $ characters

gsub("[\\[\\]$]","",mystring)

[1] "abc[de"

[[:punct:]]能够工作,但如果没有必要,我不想使用非标准的正则表达式。是否可以使用正则表达式集语法?


2
为什么不使用gsub("(\\[|\\]|\\$)","",mystring)呢?这仍然是标准的正则表达式,对吧? - Frank
1
@Frank:对我来说可以。如果你想的话,你可以添加 |\\$ 来完整匹配 OP 的示例。无论如何,将其发布为答案,你就可以得到一个赞了。 - Alex A.
3个回答

4

我建议避开使用 [ab] 语法,而是使用 (a|b)。除了能够正常工作外,这种写法还更易读:

gsub("(\\[|\\]|\\$)","",mystring)

4
你应该启用perl = TRUE,这样你就可以使用类似Perl的语法,更加直观易懂(在我看来)。
gsub("[\\[\\]$]","",mystring, perl = TRUE)

或者,当您在放置括号表达式的开始处使用]时,您可以使用“智能放置”(在其中[不是特殊字符,因此不需要转义[):
gsub("[][$]","",mystring)

查看 演示

结果:

[1] "abcde"

更多细节

[...] 结构被 TRE 正则表达式引擎视为 括号表达式(在不使用 perl=TRUE 时默认用于基础 R 正则表达式函数 - (g)sub、grep(l)、(g)regexpr - ),这是 POSIX 正则表达式结构。与 NFA 正则表达式引擎中的 字符类 不同,括号表达式不支持 转义序列,即其中的 \ 字符被视为字面反斜杠字符。

因此,在TRE正则表达式中,[\[\]]匹配\[字符(其中[\[\]部分实际上等于[\[]),然后是]。因此,它匹配\][]子字符串,请看gsub("[\\[\\]]", "", "[]\\]ab]")demo - 它输出ab],因为[]\]被匹配并最终被移除。
请注意,术语POSIX括号表达式和NFA字符类与https://www.regular-expressions.info中使用的含义相同,这不完全是一个标准,但需要区分两者。

2
R正则表达式函数中的默认值应该是 perl = TRUE - Alex A.

1

如果你只是想匹配\\[,那么不需要加上额外的方括号,除非你要匹配多个选项:

> 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接