用另一个替换一个正则表达式匹配,反之亦然

问题描述

我需要将字符串 foo bar foo bar bar foo 中的所有 foo 替换为 bar,并将所有 bar 替换为 foo。所以结果应该看起来像 bar foo bar foo foo bar

我试过这种方式:

library(stringr)

my_str <- "foo bar foo bar bar foo"
rslt <- str_replace_all(my_str,c("foo","bar"),c("bar","foo"))

print(rslt)

但我得到了 "bar bar bar bar bar bar" "foo foo foo foo foo foo"

问题:如何更正我的代码以获得 bar foo bar foo foo bar

解决方法

使用 str_replace_all 多个替换并将第一个匹配项移动到临时值。

library(stringr)

str_replace_all(my_str,c("foo" = "tmp","bar" = "foo","tmp" = "bar"))

[1] "bar foo bar foo foo bar"
,

除非您无法安装额外的软件包,否则没有真正的理由这样做,但只是为了好玩,这里有一个基本的 R 解决方案(遵循@manotheshark 回答中的“tmp”替换方法):

Reduce(
  function(prev,x) gsub(x[1],x[2],prev),list(c('foo','tmp'),c('bar','foo'),c('tmp','bar')),my_str)
# [1] "bar foo bar foo foo bar"
,

一个选项是split并替换

str_c(setNames(v1,rpl)[str_split(my_str,"\\s+")[[1]]],collapse = ' ')
#[1] "bar foo bar foo foo bar"

或者另一个选项是gsubfn

library(gsubfn)
gsubfn("(\\w+)",setNames(as.list(v1),rpl),my_str)
#[1] "bar foo bar foo foo bar"