Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R Regex用于识别和替换多个点之间的字符_R_Regex_String_Stringr - Fatal编程技术网

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

R Regex用于识别和替换多个点之间的字符,r,regex,string,stringr,R,Regex,String,Stringr,我有以下代码 "ABC.A.SVN.10.10.390.10.UDGGL" "XYZ.Z.SVN.11.12.111.99.ASDDL" 我需要替换第二个和第三个点之间的字符。在这种情况下,它是SVN,但它很可能是A和ZZZ之间的任意组合,因此真正实现这一点的唯一方法是使用点 所需成果将是: "ABC.A..10.10.390.10.UDGGL" "XYZ.Z..11.12.111.99.ASDDL" 我尝试了grep(“^.+(\\\\\).$”,“ABC.A.SVN.10.10.390.

我有以下代码

"ABC.A.SVN.10.10.390.10.UDGGL"
"XYZ.Z.SVN.11.12.111.99.ASDDL"
我需要替换第二个和第三个点之间的字符。在这种情况下,它是
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”)
的变体,但我得到了一个错误

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

编辑

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

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
。我们使用第二部分
.10
替换整个
SVN.10

另一个可行的逻辑是:

sub("\\.\\w+.\\B.",".",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
。我们使用第二部分
.10
替换整个
SVN.10

另一个可行的逻辑是:

sub("\\.\\w+.\\B.",".",x)
[1] "ABC.A..10.10.390.10.UDGGL" "XYZ.Z..11.12.111.99.ASDDL"

x


x不完全是正则表达式,但这里还有一种方法

#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"

不完全是正则表达式,但这里还有一种方法

#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"

这个答案是我使用的,因为它对我来说更容易,作为一个非正则表达式专家。我还可以使用tweep元素自定义where
{2}
。这个答案是我使用的,因为它对我来说更容易,因为我不是正则表达式专家。我还可以使用两次元素自定义where
{2}