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

时间:2018-05-29 12:54:01

标签: r regex gsub

给定字符串:

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

注释

  • 我不是在寻找基于stringr::str_extract的解决方案或任何其他不基于gsub的解决方案

1 个答案:

答案 0 :(得分:1)

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

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

请参阅this regex demothis R demo

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

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

请参阅R demoregex demo

<强>详情

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

替换模式中的\1占位符会将捕获的文本插回到结果中。