有没有办法使用正则表达式子进行否定匹配?
Posted
技术标签:
【中文标题】有没有办法使用正则表达式子进行否定匹配?【英文标题】:Is there a way to do a negative match using regex sub? 【发布时间】:2022-01-13 19:12:50 【问题描述】:假设我有一个字符串向量,
g<-c("bunchofstuff>query=true/fun/weird>bunchofstuff", "bunchofstuff>query=animals/octopus/weird>bunchofstuff", "bunchofstuff>query=flowers/sunshine/fun>bunchofstuff", "
bunchofstuff>query=fun/true/sunshine>bunchofstuff"
我想基本上使用 sub 来擦除 query= 之后的任何内容,直到字符串结尾,如果 query= 后面没有 true(理想情况下在任何位置)。据我所知,没有有用的替代 !在 sub 中(似乎是 grepl 中的一些解决方法)。 我想要的是
newvariable<-c("bunchofstuff>query=true/fun/weird>bunchofstuff", "bunchofstuff>query=", "bunchofstuff>query=", "bunchofstuff>query=fun/true/sunshine>bunchofstuff"
【问题讨论】:
【参考方案1】:你可以这样做:
sub('query=\\K(?:(?!true).)+$', '', g, perl=TRUE)
此技术使用否定的前瞻断言(?!true)
,在每个字符.
之前检查是否“真”不跟随。所有都在一个非捕获组中,重复直到字符串 $
结束。
\\K
用于在匹配字符串之后开始,以保留query=
子字符串。 (请注意,这只是避免捕获组或在替换字符串中重写query=
的一种便捷方法。)
您可以更具体地使用单词边界来确保“true”不是另一个单词的一部分:
sub('query=\\K(?:(?!\\btrue\\b).)+$', '', g, perl=TRUE)
【讨论】:
以上是关于有没有办法使用正则表达式子进行否定匹配?的主要内容,如果未能解决你的问题,请参考以下文章