R正则表达式中的双冒号含义是什么?

4
目标是删除字符串中所有非大写字母,我设法找到了一个正则表达式的解决方案,但并没有完全理解它。
> gsub("[^::A-Z::]","", "PendingApproved")
[1] "PA"

我试图阅读 R 中正则表达式的 文档,但双冒号并未得到详细说明。 [] 包含在正则表达式中匹配的字符,A-Z 表示大写字母,^ 表示非,有人能帮助我理解双冒号的含义吗?
3个回答

4
据我所知,您不需要使用这些双冒号:
gsub("[^A-Z]", "", "PendingApproved")
[1] "PA"

您当前的模式是删除任何不是A-Z 冒号 : 的字符。重复两次冒号并将其放在字符范围的两侧并没有增加任何额外的逻辑。

也许您使用的代码作者将双冒号与R的正则表达式自身语法中的命名字符类混淆了。例如,我们可以将上面的代码写成:

gsub("[^[:upper:]]","", "PendingApproved")

其中[:upper:]表示所有大写字母。

演示


对于命名字符类,没有什么比R的正则表达式自己的语法更好的了。那些像[:digit:]的结构被称为POSIX字符类,并在许多正则表达式风格中使用。此外,R在其库中有几个正则表达式引擎,包括TRE、ICU、PCRE和TCL。 - Wiktor Stribiżew
1
@WiktorStribiżew 是的,我知道这一点,我也知道各种 R 库使用不同的风格。然而,当你阅读 sub 的文档时,你会看到这些字符类被呈现为 API 的一部分。 - Tim Biegeleisen

2
为了删除所有小写字母,请使用以下方法:
gsub("[a-z]","", "PendingApproved")

^ 表示只匹配字符串的开头,因此

gsub("^[a-z]","", "PendingApproved")

这段代码不会从测试字符串中删除任何字母,因为字符串开头没有任何小写字母。

编辑:根据Tim的评论,否定也可以在字符类中使用。所以假设我们想在字母和数字组成的给定值中删除所有数字,则可以使用以下方法。

gsub("[^[:alpha:]]","", "PendingApproved1213133")

在使用gsub时,请勿替换字母。在字符类中,^表示取反。


1
这个回答没有抓到问题的点。在字符类内使用^符号是为了对该类取反,与位置无关。 - Tim Biegeleisen
@TimBiegeleisen,好的Tim,我已经把这个点加进去了。感谢你让我知道。 - RavinderSingh13

1
我们可以使用来自stringr的str_remove。
library(stringr)
str_remove_all("PendingApproved", "[a-z]+")
#[1] "PA"

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