有没有办法使用正则表达式子进行否定匹配?

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)

【讨论】:

以上是关于有没有办法使用正则表达式子进行否定匹配?的主要内容,如果未能解决你的问题,请参考以下文章

如何否定Java中的任何正则表达式

正则表达式 - 使用否定环视匹配同句中的单词

正则表达式的否定

js正则表达式中的正向肯定预查和正向否定预查

带有`\R`的Java-8 正则表达式否定回溯

使用正则表达式删除注释