如何与正则expression式“反向匹配”?

我正在使用RegexBuddy,但是我遇到了麻烦:\

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

现在我想做一个逆匹配…即我想匹配的行有6个字母的string,但只有这六个字母不是 安德烈 ,我该怎么做?


编辑:我会写的程序,使用这个正则expression式,我不知道如果在Python或PHP,我正在做这件事情,先学习一些正则expression式:)有不同types的行,我想使用正则expression式select我感兴趣的types。一旦我得到了这些线我必须申请一个其他的filter只是为了不匹配一个已知的价值,我需要所有其他的,而不是。 (?!不想要的)工作得很好,谢谢。 🙂

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

(?!Andrea).{6} 

假设你的正则expression式引擎支持负面的lookaheads ..

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

编辑(再次):请注意,先行和后视一般不是正则expression式匹配的“反向”。 正则expression式并不是真正为负面匹配而设置的,他们把它留给你使用的任何语言。

对于Python / Java,

 ^(.(?!(some text)))*$ 

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

你使用什么语言? 正则expression式实现的function和语法对此很重要。

你可以使用预见。 以python为例

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

打破这一点:

(?!Andrea)表示如果接下来的6个字符不是“Andrea”,则匹配“; 如果是的话

\ w表示一个“单词字符” – 字母数字字符。 这相当于类[a-zA-Z0-9_]

\ w {6}意味着正好6个字的字符。

re.IGNORECASE意味着你将排除“Andrea”,“andrea”,“ANDREA”…

另一种方法是使用你的程序逻辑 – 使用所有不符合Andrea的行,并通过第二个正则expression式检查6个字符。 或者首先检查至less6个字的字符,然后检查它是否与Andrea不匹配。

更新了Alan Moore的反馈

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

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

这被称为脾气暴躁的令牌 。 不利的一面是它performance不佳。

负面的前瞻断言

 (?!Andrea) 

这不完全是一个倒序匹配,但它是最好的,你可以直接使用正则expression式。 不是所有的平台都支持它们。

如果你想在RegexBuddy中做到这一点,有两种方法可以得到所有不匹配正则expression式的行的列表。

在“testing”面板的工具栏上,将testing范围设置为“逐行”。 当你这样做时,一个项目列出所有没有匹配的行将出现在同一工具栏上的全部列表button下。 (如果您没有看到“全部列表”button,请单击主工具栏中的“匹配”button。)

在GREP面板上,您可以打开“基于行”和“反转结果”checkbox,以获取您正在扫描的文件中的不匹配行的列表。

(?!在实践中是有用的,尽pipe严格地说,outlook在math上是非正则expression式。

您可以手动编写反转正则expression式。

这是一个自动计算结果的程序 。 其结果是机器生成的,通常比手写更复杂。 但结果起作用。

我刚刚提出了这种方法,可能是硬件密集型,但它的工作:

您可以用空stringreplace所有匹配正则expression式的字符。

这是一个oneliner:

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

我用这个,因为我被迫使用一个非常复杂的正则expression式,并不知道如何反转它的每一个部分。

这只会返回string结果,而不是任何匹配对象!

在Perl中你可以做

进程($ line)if($ line =〜!/ Andrea /);

Interesting Posts