如何与正则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 /);