仅使用 gsub 替换表达式以外的所有字符

Replace all characters except expression using gsub only

给定的字符串:

smple_paths <- c("/path/path/path/abc22/path/path",
                 "/apath/apath/paath/abc11/something/path")

我想替换所有字符,不包括短语 abc\d{2}

尝试

gsub(
    pattern = "(?!abc\d{2})",
    replacement = "",
    x = smple_paths,
    perl = TRUE
)

# [1] "/path/path/path/abc22/path/path"        
# [2] "/apath/apath/paath/abc11/something/path"

想要的结果

abc22
abc11

备注

如果您不关心 abc\d{2} 上下文,您可以使用

sub(".*(abc\d{2}).*", "\1", smple_paths)

参见 this regex demo and this R demo

如果您关心上下文,您可以匹配并捕获 abc + / 之后和 / 之前或字符串末尾的 2 个数字,同时匹配之前和之前的任何文本在这个模式之后使用

 sub("^.*/(abc\d{2})(?:/.*)?$", "\1", smple_paths)

参见R demo and a regex demo

详情

  • ^ - 字符串的开头(此处不需要,但为了清楚起见保留)
  • .* - 任意 0+ 个字符,尽可能多
  • / - 一个 / 字符
  • (abc\d{2}) - 第 1 组:abc 和 2 个数字
  • (?:/.*)? - / 的可选(1 次或 0 次)出现,后跟尽可能多的 0+ 个字符
  • $ - 字符串结尾。

替换模式中的 占位符将捕获的文本插入到结果中。