2016-12-05 80 views
3

我想从包含大量字符串的下列矢量中删除字符'V'(总是字符串中的最后一个)。他们看起来类似于下面的例子:R删除字符串中可能位置范围内的特定字符

str <- c("VDM 000 V2.1.1", 
     "ABVC 001 V10.15.0", 
     "ASDV 123 V1.20.0") 

我知道它总是最后'V',我想删除。 我也知道这个字符是这些字符串中的第六,第七或第八个最后一个字符。

我真的不能想出一个很好的解决方案。我知道我必须使用sub或gsub,但我只能删除所有V而不是最后一个。

有没有人有想法?

谢谢!

+0

尝试'子( “V([^ V] *)$”, “\\ 1”,STR)',改编自[这里](http://stackoverflow.com/questions/3829483/how-to-replace-last-occurrence-of-characters-in-a-string-using-javascript)。 –

+0

@Richard:会取代最后一个“V”但不是最后的“V”限于6:8的位置。 –

回答

1

既然你知道这是你想从字符串中删除最后V,试试这个正则表达式V(?=[^V]*$)

gsub("V(?=[^V]*$)", "", str, perl = TRUE) 
# [1] "VDM 000 2.1.1" "ABVC 001 10.15.0" "ASDV 123 1.20.0" 

正则表达式匹配它由非V字符从字符串的结束模式[^V]*$之前的v ,这保证匹配的V是字符串中的最后一个V

2

可以使用:

gsub("V(\\d+.\\d+.\\d+)$","\\1",str) 
##[1] "VDM 000 2.1.1" "ABVC 001 10.15.0" "ASDV 123 1.20.0" 

V(\\d+.\\d+.\\d+)$匹配“版本”由...组成的字符“V”,随后三组由两个分离的数字(即,\\d+)的正则表达式“”在字符串的末尾(即$)。围绕\\d+.\\d+.\\d+的括号提供了一个可以被\\1引用的匹配组。因此,gsub将取代与该组的整个比赛,从而删除那个“V”。

3

这个正则表达式模式的写法是匹配一个“V”,然后是5到7个其他非“V”字符。 “[...]”构造是“角色阶级”,在这样的构造中,领先的“^”会导致否定。 “{...} consturct允许指定最小和最大长度的两个数字,而”$“匹配您在编写”第六,第七或第八个最后一个字符“时所期望的长度为0的字符串结尾:

sub("(V)(.{5,7})$", "\\2", str) 
[1] "VDM 000 2.1.1" "ABVC 001 10.15.0" "ASDV 123 1.20.0" 

既然你只是想我以前sub代替gsub一个替代。

相关问题