【问题标题】: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"

【问题讨论】:

    标签: r regex


    【解决方案1】:

    你可以这样做:

    sub('query=\\K(?:(?!true).)+$', '', g, perl=TRUE)
    

    此技术使用否定的前瞻断言(?!true),在每个字符. 之前检查是否“真”不跟随。所有都在一个非捕获组中,重复直到字符串 $ 结束。

    \\K 用于在匹配字符串之后开始,以保​​留query= 子字符串。 (请注意,这只是避免捕获组或在替换字符串中重写query= 的一种便捷方法。)

    您可以更具体地使用单词边界来确保“true”不是另一个单词的一部分:

    sub('query=\\K(?:(?!\\btrue\\b).)+$', '', g, perl=TRUE)
    

    【讨论】:

      猜你喜欢
      • 2013-02-26
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      相关资源
      最近更新 更多