首页 > 解决方案 > 用一个正则表达式替换字符串中的模式

问题描述

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

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

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

问题

有没有一个regex我可以通过一个 电话来实现这一点gsub?或者是否有任何库函数可以让我一次性替换后缀?

标签: rregex

解决方案


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

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

结果

      a.x       a.y       b.y       b.x 
"string1" "string2" "string2" "string1" 

推荐阅读