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

3

给定字符串:

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} 吗?regmatches(smple_paths, gregexpr("abc\\d{2}", smple_paths)) 为什么要替换 - Wiktor Stribiżew
2
为什么不使用像sub("^.*/(abc\\d{2})(?:/.*)?$", "\\1", smple_paths)这样简单的东西呢? - Wiktor Stribiżew
是的,但是如注释所述,它必须进入 gsub 语法。 - Konrad
@WiktorStribiżew 如果您愿意将“sub”注释变成答案,我会很乐意接受。 - Konrad
1个回答

2

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

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

请看此正则表达式演示此R演示
如果您关注上下文,可以匹配并捕获abc + 2位数字在/之后、/之前或字符串末尾的模式,同时匹配此模式之前和之后的任何文本。
 sub("^.*/(abc\\d{2})(?:/.*)?$", "\\1", smple_paths)

请查看R演示正则表达式演示细节
  • ^ - 字符串的开头(在此处不是必需的,但为了清晰起见保留)
  • .* - 任意0+个字符,并尽可能多地匹配
  • / - 一个/字符
  • (abc\\d{2}) - 第1组: abc 和 2 个数字
  • (?:/.*)? - 可选的(出现1次或0次)/,后面跟任意0+个字符,并尽可能多地匹配
  • $ - 字符串的结尾。
替换模式中的\1占位符将捕获的文本插入到结果中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接