代码之家  ›  专栏  ›  技术社区  ›  Andrea Ambu

如何与regex“反向匹配”?

  •  89
  • Andrea Ambu  · 技术社区  · 16 年前

    我正在使用RegexBuddy,但我在这件事上遇到了麻烦:\

    我正在逐行处理一个文件。我做了一个“线条模型”来匹配我想要的。

    现在我想做一个反向匹配…也就是说,我想匹配有6个字母串的行,但前提是这6个字母是 安德莉亚 我该怎么做?


    编辑: 我将编写使用这个regex的程序,我还不知道是否在python或php中,我首先要做的是学习一些regex:)有不同的 类型 我想用regex来选择我感兴趣的类型。一旦我得到了这些行,我就必须应用另一个过滤器来不匹配已知的值,我需要所有其他的,而不是那个。(?)!不需要)工作很好,谢谢。-)

    我希望这能澄清这个问题。)

    9 回复  |  直到 7 年前
        1
  •  55
  •   Dan Aditi    16 年前
    (?!Andrea).{6}
    

    假设您的regexp引擎支持负lookaheads。

    编辑:…或者也许你更喜欢使用 [A-Za-z]{6} 代替 .{6}

    编辑(再次):注意lookaheads和lookbehinds通常不是“反转”正则表达式匹配的正确方法。regexp并没有真正设置为进行负匹配,而是将其留给您使用的任何语言。

        2
  •  43
  •   Rahul    9 年前
        3
  •  15
  •   Zenexer    7 年前

    更新了来自的反馈 Alan Moore

    在PCRE和类似的变体中,实际上可以创建与不包含值的任何行匹配的regex:

    ^(?:(?!Andrea).)*$
    

    这叫A tempered greedy token . 缺点是它的表现不好。

        4
  •  10
  •   Hamish Downer JKP    16 年前

    你用什么语言?为此,regex实现的功能和语法至关重要。

    你可以用“向前看”。以python为例

    import re
    
    not_andrea = re.compile('(?!Andrea)\w{6}', re.IGNORECASE)
    

    要将其分解:

    ?安德列! 表示“如果后面6个字符不是“Andrea”,则匹配”;如果是,则

    \w 表示“字字符”-字母数字字符。这相当于等级[A-ZA-Z0-9 uu]

    \W{ 6 } 表示6个字的字符。

    再忽略 意味着您将排除“Andrea”、“Andrea”、“Andrea”…

    另一种方法是使用程序逻辑-使用所有与Andrea不匹配的行,并通过第二个regex检查6个字符。或者首先检查至少6个字的字符,然后检查它是否与Andrea不匹配。

        5
  •  5
  •   Vinko Vrsalovic    16 年前

    Negative lookahead assertion

    (?!Andrea)
    

    这不是一个完全相反的匹配,但这是最好的你可以直接用regex。但并非所有的平台都支持它们。

        6
  •  4
  •   Jan Goyvaerts    16 年前

    如果要在regexbuddy中执行此操作,有两种方法可以获取与regex不匹配的所有行的列表。

    在测试面板的工具栏上,将测试范围设置为“逐行”。执行此操作时,项目列表所有不匹配的行将显示在同一工具栏上的“列出所有”按钮下。(如果看不到“列出全部”按钮,请单击主工具栏中的“匹配”按钮。)

    在grep面板上,您可以打开“基于行”和“反转结果”复选框,以获取正在进行grepping的文件中不匹配行的列表。

        7
  •  3
  •   weakish    10 年前

    (?! 在实践中很有用。 尽管严格地说,展望未来并不是数学上定义的正则表达式。

    可以手动编写反转正则表达式。

    这里是 a program 自动计算结果。 其结果是机器生成的,通常比手写的要复杂得多。 但结果是可行的。

        8
  •  0
  •   Matthias Herrmann timelfelt    8 年前

    我刚刚想出了这个方法,可能是硬件密集型的,但它正在工作:

    可以用空字符串替换与regex匹配的所有字符。

    这是一条单行线:

    notMatched = re.sub(regex, "", string)

    我使用这个是因为我不得不使用一个非常复杂的regex,并且无法理解如何反转它的每个部分。

    这将只返回字符串结果,而不返回任何匹配对象!

        9
  •  -3
  •   phreakre    16 年前

    在Perl中,您可以做到

    如果($line=~,则处理($line)!/安德列/);

    推荐文章