我想替换字符串中的后缀。该后缀可以是.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
的一个来实现?还是有任何库函数可用来一次性替换后缀?
答案 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"