使用sub增加字符串中的数字

时间:2016-08-15 19:34:05

标签: regex r gsub

在其中有一个带有(单个)数字的字符串。我想将数字增加一个。简单吧?我写了下面的内容而没有再想一想:

sub("([[:digit:]]+)", as.character(as.numeric("\\1")+1), string)

......并获得了NA。

> sub("([[:digit:]]+)", as.character(as.numeric("\\1")+1), "x is 5")
[1] NA
Warning message:
In sub("([[:digit:]]+)", as.character(as.numeric("\\1") + 1), "x is 5") :
  NAs introduced by coercion

为什么不起作用?我知道其他方法,所以我不需要“解决方案”。我想了解为什么这种方法失败了。

2 个答案:

答案 0 :(得分:3)

关键是反向引用仅在匹配操作期间进行评估,并且在此之前无法将其传递给任何函数。

当您编写as.numeric("\\1")时,as.numeric函数接受\1字符串(反斜杠和1字符)。因此,结果是预期的,NA

这是因为R中没有内置的反向引用插值。

您可以使用gsubfn套餐:

> library(gsubfn)
> s <- "x is 5"
> gsubfn("\\d+", function(x) as.numeric(x) + 1, s)
[1] "x is 6"

答案 1 :(得分:2)

它不起作用,因为sub的参数在传递给正则表达式引擎(由.Internal调用之前)进行评估。

特别是,as.numeric("\\1")评估为NA ...之后你就注定了。