我想删除字符' V' (始终是字符串中的最后一个)来自包含大量字符串的以下向量。它们看起来类似于以下示例:
str <- c("VDM 000 V2.1.1",
"ABVC 001 V10.15.0",
"ASDV 123 V1.20.0")
我知道它始终是最后一个&#39;我想删除。 我也知道这个字符是这些字符串中的第六个,第七个或第八个字符。
我真的无法想出一个好的解决方案。我知道我必须使用sub或gsub,但我只能删除所有的V而不是最后一个。
有人有想法吗?
谢谢!
答案 0 :(得分: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
。
答案 1 :(得分: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+)$
匹配&#34;版本&#34;由角色组成&#34; V&#34;接着是由两个&#34;分隔的三组数字(即\\d+
)。&#34;在字符串的末尾(即$
)。 \\d+.\\d+.\\d+
周围的括号提供了匹配中可由\\1
引用的组。因此,gsub
将替换整个匹配组,从而删除 &#34; V&#34;。
答案 2 :(得分: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
字符串。