【问题标题】:Invert match with regexp [duplicate]使用正则表达式反转匹配[重复]
【发布时间】:2010-10-31 17:44:01
【问题描述】:

使用 PCRE,如何构造一个仅在 not 找到字符串时才匹配的表达式。

如果我使用 grep(我不是),我会想要 -v 选项。

一个更具体的例子:我希望我的正则表达式匹配 iff 字符串 foo 在字符串中是 not。所以它会匹配bar,但不会匹配foobar

【问题讨论】:

  • 这是输入到广告 PCRE 的网络服务中。所以语言是 PCRE,真的。
  • 如果有一个工作的基本案例示例会更好

标签: regex pcre


【解决方案1】:

好的,我已经根据您提出的解决方案改进了我的正则表达式(它错误地匹配以 'test' 开头的字符串)。

^((?!foo).)*$

这个正则表达式将只匹配不包含 foo 的字符串。第一个前瞻将拒绝以 'foo' 开头的字符串,第二个将确保在字符串的其他位置找不到 foo。

【讨论】:

    【解决方案2】:

    根据丹尼尔的回答,我认为我有一些可行的方法:

    ^(.(?!test))*$
    

    关键是你需要对字符串中的每个字符进行否定断言

    【讨论】:

    • 我也不相信这会奏效;它将匹配字符串'test'。
    • 射击——你是对的。这对于我目前的情况来说已经足够好了,因为边缘情况没有发生,但它并不能完全解决问题。
    • 我删除了原来的答案并发布了一个新的答案,它应该可以完全解决问题,包括边缘情况。基本上我的原始答案拒绝了以您的子字符串开头的字符串,而您的拒绝了包含子字符串但不以它开头的字符串。将它们放在一起是解决方案。 :)
    【解决方案3】:

    确实几乎是重复的。我猜你正在寻找的正则表达式是

    (?!foo).*

    【讨论】:

      【解决方案4】:

      构建一个匹配的表达式,并使用 !match()...(逻辑否定) 无论如何,这可能就是 grep 的作用......

      【讨论】:

      • 我无法控制直接评估匹配的代码,所以很遗憾,这不是一个选项。
      【解决方案5】:

      您也可以使用re.split 执行此操作(在python 中),并根据您的正则表达式进行拆分,从而返回所有与正则表达式不匹配的部分splitting based on what doesn't match a regularexpression

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-03
        • 1970-01-01
        • 2014-02-05
        • 2012-10-31
        • 2020-04-09
        相关资源
        最近更新 更多