如何与正则表达式"反向匹配"?

And*_*mbu 100 regex inverse-match

我正在使用RegexBuddy,但无论如何我都遇到了麻烦:

我正在逐行处理一个文件.我建立了一个"线型"来匹配我想要的东西.

现在我想做一个反向匹配...即我想匹配有6个字母的字符串,但只有这六个字母不是 Andrea,我该怎么做?


编辑:我会编写使用这个正则表达式的程序,我不知道如果在python或php中,我首先要做的事情是学习一些正则表达式:)有不同类型的行,我想用正则表达式选择我感兴趣的类型.一旦我得到这些行,我将应用另一个过滤器只是为了与已知值不匹配,我需要所有其他的,而不是那个.(?!not-wanted)工作得很好,谢谢.:-)

我希望这澄清了这个问题:)

Dan*_*Dan 66

(?!Andrea).{6}
Run Code Online (Sandbox Code Playgroud)

假设你的正则表达式引擎支持负向前瞻...

编辑:..或者你可能更喜欢用[A-Za-z]{6}它代替.{6}

编辑(再次):请注意,前瞻和后瞻通常不是"反转"正则表达式匹配的正确方法.Regexs并不是真正用于进行负匹配,而是将它留给你使用它们的任何语言.

  • .默认情况下不匹配\n(某些语言[例如Perl]允许您打开该行为,但默认情况下.匹配所有内容但是\n). (2认同)

小智 47

对于Python/Java,

^(.(?!(some text)))*$
Run Code Online (Sandbox Code Playgroud)

http://www.lisnichenko.com/articles/javapython-inverse-regex.html

  • 这行不通。您正在考虑脾气暴躁的令牌习语。但该点必须在* looka *之后,而不是之前。参见[这个问题](http://stackoverflow.com/questions/30900794/tempered-greedy-token-what-is-different-about-placing-the-dot-before-the-negat)。但是无论如何,这种方法对于这个任务来说是过大的。 (3认同)
  • @Zenexer,这就是我的意思。如果点在前瞻之后而不是之前,它就完美无缺。 (2认同)

Zen*_*xer 18

更新了Alan Moore的反馈

在PCRE和类似的变体中,您实际上可以创建一个匹配任何不包含值的行的正则表达式:

^(?:(?!Andrea).)*$
Run Code Online (Sandbox Code Playgroud)

这被称为驯化贪婪令牌.缺点是它表现不佳.

  • 这是长篇形式的“调和贪婪令牌”。只需将点(或“[\s\S]”,仅在 JavaScript 中有用)放在第二个前瞻之后,就不需要第一个:“^(?:(?!Andrea).)* $`。 (2认同)
  • @AlanMoore 不错!我找不到任何既定的模式可以像这样工作,所以我想出了自己的模式。你应该提供你自己的答案,而不是我接受你的答案。 (2认同)

Ham*_*ner 11

你用的是哪种语言?正则表达式实现的功能和语法对此非常重要.

你可以使用预测.以python为例

import re

not_andrea = re.compile('(?!Andrea)\w{6}', re.IGNORECASE)
Run Code Online (Sandbox Code Playgroud)

打破这种情况:

(?!Andrea)的意思是'匹配,如果接下来的6个字符不是"Andrea"'; 如果是的话

\ w表示"单词字符" - 字母数字字符.这等同于[a-zA-Z0-9_]类

\ w {6}表示正好是6个字的字符.

re.IGNORECASE意味着你将排除"Andrea","andrea","ANDREA"......

另一种方法是使用你的程序逻辑 - 使用不匹配Andrea的所有行,并通过第二个正则表达式来检查6个字符.或者首先检查至少6个单词字符,然后检查它是否与Andrea不匹配.


Vin*_*vic 6

否定先行断言

(?!Andrea)
Run Code Online (Sandbox Code Playgroud)

这不是一个倒置的匹配,但它是你可以直接用正则表达式做的最好的.但并非所有平台都支持它们.


Jan*_*rts 5

如果要在RegexBuddy中执行此操作,有两种方法可以获取所有不匹配正则表达式的行的列表。

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

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


wea*_*ish 5

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

您可以手动编写一个反正则表达式。

这是一个自动计算结果的程序。其结果是机器生成的,通常比手写一个要复杂得多。但是结果有效。


Mat*_*ann 5

我刚刚想出了这个方法,它可能是硬件密集型的,但它有效:

您可以用空字符串替换与正则表达式匹配的所有字符。

这是一个单线:

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

我使用它是因为我被迫使用非常复杂的正则表达式,并且无法弄清楚如何在合理的时间内反转它的每个部分。

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