我有以下代码
"ABC.A.SVN.10.10.390.10.UDGGL"
"XYZ.Z.SVN.11.12.111.99.ASDDL"
我需要替换第2点和第3点之间存在的字符。在这种情况下它是SVN
,但它可能是A
和ZZZ
之间的任意组合,所以真正唯一的方法就是使用点。
所需的结果将是:
"ABC.A..10.10.390.10.UDGGL"
"XYZ.Z..11.12.111.99.ASDDL"
我尝试了grep("^.+(\\.\\).$", "ABC.A.SVN.10.10.390.10.UDGGL")
的变体,但是我收到了错误。
我尝试过的一些例子没有成功:
修改
我尝试了@Onyambu的第一种方法,然后遇到了一个我没有考虑的变种:"ABC.A.AB11.1.12.112.1123.UDGGL"
。在替换部分,我也有数值。期望的结果是"ABC.A..1.12.112.1123.UDGGL"
,我在答案的第二部分使用sub("\\.\\w+.\\B.",".",x)
得到它!
答案 0 :(得分:2)
x= "ABC.A.SVN.10.10.390.10.UDGGL" "XYZ.Z.SVN.11.12.111.99.ASDDL"
sub("([A-Z]+)(\\.\\d+)","\\2",x)
[1] "ABC.A..10.10.390.10.UDGGL" "XYZ.Z..11.12.111.99.ASDDL"
([A-Z]+)
捕获任何包含字符A-Z (\\.\\d+)
上面捕获的单词后面必须跟一个点\\.
。此点后面跟着数字\\d+
。这样就完成了捕获。到目前为止,字符串"ABC.A.SVN.10.10.390.10.UDGGL"
的捕获部分是SVN.10
,因为这是与正则表达式匹配的部分。但此部分被捕获为SVN
和.10
。我们进行反向引用,即将整个SVN.10
替换为第二部分.10
另一种可行的逻辑:
sub("\\.\\w+.\\B.",".",x)
[1] "ABC.A..10.10.390.10.UDGGL" "XYZ.Z..11.12.111.99.ASDDL"
答案 1 :(得分:2)
x <- c("ABC.A.SVN.10.10.390.10.UDGGL", "XYZ.Z.SVN.11.12.111.99.ASDDL")
sub("^(?:[^.]*\\.){2}\\K[^.]*", "", x, perl=T)
^
在行首处断言位置(?:[^.]*\.){2}
完全匹配以下两次
[^.]*\.
多次匹配.
以外的任何字符,然后.
\K
重置模式的起点。最终匹配中不再包含任何以前消费的字符[^.]*
匹配除.
以外的任何字符 [1] "ABC.A..10.10.390.10.UDGGL" "XYZ.Z..11.12.111.99.ASDDL"
答案 2 :(得分:1)
不完全正则表达式,但这是另一种方法
#DATA
S = c("ABC.A.SVN.10.10.390.10.UDGGL", "XYZ.Z.SVN.11.12.111.99.ASDDL")
sapply(X = S,
FUN = function(str){
ind = unlist(gregexpr("\\.", str))[2:3]
paste(c(substring(str, 1, ind[1]),
"SUBSTITUTION",
substring(str, ind[2], )), collapse = "")
},
USE.NAMES = FALSE)
#[1] "ABC.A.SUBSTITUTION.10.10.390.10.UDGGL" "XYZ.Z.SUBSTITUTION.11.12.111.99.ASDDL"