R 用字符数替换字符串中单词的一部分

R 用字符数替换字符串中单词的一部分,r,regex,R,Regex,我有一个长字符串,我想匹配并用它们各自的字符数替换单词的某些部分。我曾尝试使用分组来计算反向引用组的字符数,但当我调用nchar时,它无法识别反向引用 gsub("\\b([a-z])([a-z]{1,})([a-z])",paste0("\\1",nchar("\\2"),"\\3"),"this is a test string") [1] "t2s is a t2t s2g" 我想得到的答案是: [1] "t2s is a t2t s4g" 有没有办法计算组中的

我有一个长字符串,我想匹配并用它们各自的字符数替换单词的某些部分。我曾尝试使用分组来计算反向引用组的字符数,但当我调用nchar时,它无法识别反向引用

    gsub("\\b([a-z])([a-z]{1,})([a-z])",paste0("\\1",nchar("\\2"),"\\3"),"this is a test string")
    [1] "t2s is a t2t s2g"
我想得到的答案是:

    [1] "t2s is a t2t s4g"

有没有办法计算组中的字符数并使用gsub替换?

您可以使用
gsubfn
来操作捕获组:

> library(gsubfn)
> gsubfn("\\y([a-z])([a-z]+)([a-z])", function(x,y,z) paste0(x,nchar(y),z),"this is a test string")
[1] "t2s is a t2t s4g"
请注意,
\y
是Tcl正则表达式模式中的单词边界(相当于
\b
)(
gsubfn
默认使用Tcl正则表达式库)。您也可以使用
perl=TRUE
来使用
\b

> gsubfn("\\b([a-z])([a-z]+)([a-z])", function(x,y,z) paste0(x,nchar(y),z),"this is a test string", perl=TRUE)
[1] "t2s is a t2t s4g"

请注意,捕获组值通过
x
(=
\1
)、
y
(=
\2
)和
z
(=
\3
)传递给匿名替换函数。

在base R中,您可以执行以下操作:

x="This is a test string"
x=y
regmatches(y,b)<-Map(attr,b<-gregexpr("\\B([a-z]+)\\B",x),"match.length")
y
[1] "t2s is a t2t s4g"
x=“这是一个测试字符串”
x=y
regmatches(y,b)