R 用一个正则表达式替换字符串中的模式

R 用一个正则表达式替换字符串中的模式,r,regex,R,Regex,我想替换字符串中的后缀。此后缀可以是.x或.y。如果它是.x我想用string1替换它(比如说)如果它是.y它应该被string2替换。(替换字符串是任意的,但后缀和替换字符串之间有明确的映射,例如.x->.string1和.y->.string2) 我可以通过如下方式使用两次调用gsub轻松实现这一点: in_str <- c("a.x", "a.y") gsub("\\.y$", ".string2", gsub("\\.x$", ".string1", in_str))) # [1]

我想替换字符串中的后缀。此后缀可以是
.x
.y
。如果它是
.x
我想用
string1
替换它(比如说)如果它是
.y
它应该被
string2
替换。(替换字符串是任意的,但后缀和替换字符串之间有明确的映射,例如
.x->.string1
.y->.string2

我可以通过如下方式使用两次调用
gsub
轻松实现这一点:

in_str <- c("a.x", "a.y")
gsub("\\.y$", ".string2", gsub("\\.x$", ".string1", in_str)))
# [1] "a.string1" "a.string2"

in_str我不认为这就是正则表达式的用途,我会用不同的方式:

in_str <- c("a.x", "a.y", "b.y", "b.x")
strmap <- c(.x="string1", .y="string2")
strmap[ gsub(".*(\\.[xy])$", "\\1", in_str) ]
这样做的好处是更加灵活,并且可以将后缀映射的定义与进行映射的实际函数清晰地分开。您甚至可以将其自动化:

in_str <- c("a.x", "a.y", "b.y", "b.x")
strmap <- c(x="string1", y="string2")
suffixes <- paste0(names(strmap), collapse="")
pattern <- sprintf(".*\\.([%s])$", suffixes)
res <- strmap[ gsub(pattern, "\\1", in_str) ]
names(res) <- in_str

您可以使用
mgsub
,它接受具有多个替换的多个模式

mgsub::mgsub(in_str, c("\\.x$", "\\.y$"), c(".string1", ".string2"))
#[1] "a.string1" "a.string2"

从“干净代码”的角度来看,首先将字符串拆分为前缀和后缀,然后使用
if
构建新字符串肯定会更清楚。可能有兴趣。@ismirsehregal谢谢,这正是我想要的+1!作为参考,代码如下:
gsubfn(“\\..$”,list(“.x”=”.string1“,“.y”=”.string2”),in_str)
@thothal如果链接提供了您问题的答案,您认为它应该标记为该问题的副本吗?或者你认为这些是不同的问题?是的,的确如此,我把它标记为重复的,谢谢你指出。谢谢你的回答。这并不完全是我想要的,因为我只想替换后缀,而不是整个字符串,所以结果应该是
c(“a.string1”、“a.string2”、“b.string1”、“b.string2”)
。我知道如何调整您的代码来实现这一点,但我想在这种情况下,2
gsub
更容易。
      a.x       a.y       b.y       b.x 
"string1" "string2" "string2" "string1" 
mgsub::mgsub(in_str, c("\\.x$", "\\.y$"), c(".string1", ".string2"))
#[1] "a.string1" "a.string2"