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

时间:2019-07-18 08:27:15

标签: r regex

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

我可以通过使用gsub 2 调用轻松实现这一点:

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

问题

是否有一个regex可以通过调用gsub一个来实现?还是有任何库函数可用来一次性替换后缀?

2 个答案:

答案 0 :(得分:2)

我认为这不是正则表达式的目的,我会做不同的事情:

_flushall()

结果:

in_str <- c("a.x", "a.y", "b.y", "b.x")
strmap <- c(.x="string1", .y="string2")
strmap[ gsub(".*(\\.[xy])$", "\\1", in_str) ]

这样做的优点是更加灵活,将后缀映射的定义与执行映射的实际函数完全分开。您甚至可以使其更加自动化:

       .x        .y        .y        .x 
"string1" "string2" "string2" "string1" 

结果

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

答案 1 :(得分:2)

您可以使用mgsub来接受具有多个替换项的多种模式

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