好像你想删除字母字符,所以
gsub("[[:alpha:]]", "", x)
其中[:alpha:] 是字母(小写和大写)字符的类别,[[:alpha:]] 表示“匹配任何单个字母字符”,gsub() 表示全局替换任何带有空的字母字符字符串""。这似乎比尝试匹配括号内的数字要好,后者需要弄清楚哪些字符需要用(双精度!)\\ 进行转义。
如果打算返回唯一括号内的数字,那么方法是提取匹配项(而不是删除不需要的字符)。我不会使用gsub() 将匹配项替换为具有另一个值的正则表达式,而是使用gregexpr() 来识别匹配项,并使用regmatches() 来提取匹配项。由于数字总是出现在[] 中,我将简化正则表达式以匹配集合+[:digit:] 中的一个或多个(+)字符。
> xx <- regmatches(x, gregexpr("[+[:digit:]]+", x))
> xx
[[1]]
[1] "+229" "+57" "+229"
xx 是一个长度等于x 长度的列表。我将编写一个函数,对于此列表的任何元素,使值唯一,用[ 和] 包围这些值,并将它们连接起来
fun <- function(x)
paste0("[", unique(x), "]", collapse = "")
这需要应用到列表的每个元素上,并简化为一个向量,任务为sapply()。
> sapply(xx, fun)
[1] "[+229][+57]"
一个小的改进是使用vapply(),这样结果对于零长度输入是稳健的(总是返回长度等于x的字符向量)
> x = character()
> xx <- regmatches(x, gregexpr("[+[:digit:]]+", x))
> sapply(xx, fun) # Hey, this returns a list :(
list()
> vapply(xx, fun, "character") # vapply() deals with 0-length inputs
character(0)