仅使用 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
备注
- 我不是在寻找基于
stringr::str_extract
的解决方案或任何其他不基于 gsub
的解决方案
如果您不关心 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+ 个字符
$
- 字符串结尾。
替换模式中的
占位符将捕获的文本插入到结果中。
给定的字符串:
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
的解决方案
如果您不关心 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+ 个字符$
- 字符串结尾。
替换模式中的 占位符将捕获的文本插入到结果中。