R Regex用于识别和替换多个点之间的字符

时间:2018-01-26 17:03:04

标签: r regex string stringr

我有以下代码

"ABC.A.SVN.10.10.390.10.UDGGL"
"XYZ.Z.SVN.11.12.111.99.ASDDL"

我需要替换第2点和第3点之间存在的字符。在这种情况下它是SVN,但它可能是AZZZ之间的任意组合,所以真正唯一的方法就是使用点。

所需的结果将是:

"ABC.A..10.10.390.10.UDGGL"
"XYZ.Z..11.12.111.99.ASDDL"

我尝试了grep("^.+(\\.\\).$", "ABC.A.SVN.10.10.390.10.UDGGL")的变体,但是我收到了错误。

我尝试过的一些例子没有成功:

Link 1 Link 2

修改

我尝试了@Onyambu的第一种方法,然后遇到了一个我没有考虑的变种:"ABC.A.AB11.1.12.112.1123.UDGGL"。在替换部分,我也有数值。期望的结果是"ABC.A..1.12.112.1123.UDGGL",我在答案的第二部分使用sub("\\.\\w+.\\B.",".",x)得到它!

3 个答案:

答案 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)

See code in use here

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"