我想说我想将字符串X0_Y1_Z2
更改为X0_Y1_Z1
,即将最后一个数字减一。我通过R中的以下陈述尝试了它,它不起作用:
sub("(\\S+_\\S+_)\\S(\\d)", paste0("\\1", as.numeric("\\2")-1), "X0_Y1_Z2", perl=T)
我该怎么做?
答案 0 :(得分:2)
如果您始终使用相同格式的字符串,并且只有1个最后一位要递减,请使用简单的substring
:
> paste0(substring(s, 1, nchar(s)-1), as.numeric(substring(s, nchar(s))) - 1)
> [1] "X0_Y1_Z1"
为了匹配字符串中的最后一个数字块,请使用[0-9]+$
正则表达式。要增加该值,请使用gsubfn
包。查看示例代码:
> library(gsubfn)
> s <- "X0_Y1_Z2"
> gsubfn('[0-9]+$', ~ as.numeric(x)-1, s)
[1] "X0_Y1_Z1"
如果您需要按照您的方式验证字符串,请使用更多组,锚点^
和$
将要求整个字符串与模式匹配(&#34;完整字符串匹配& #34):
> p <- "^(\\S+_\\S+_\\S)(\\d+)$"
> gsubfn(p, function(x1,x2) paste0(x1, as.numeric(x2)-1), s)
[1] "X0_Y1_Z1"