如何与正则表达式"逆向匹配"?
我正在使用RegexBuddy,但是无论如何我还是很麻烦:
我正在逐行处理文件。我建立了一个"线模型"来匹配我想要的。
现在我想进行逆向匹配...也就是说,我想匹配有6个字母的字符串的行,但是只有这6个字母不是Andrea时,我才应该这样做?
编辑:我将编写使用此正则表达式的程序,我尚不知道是否在python或者php中,我首先要学习一些正则表达式:)有不同类型的行,我想使用正则表达式选择我感兴趣的类型。一旦获得这些行,我就必须应用另一个过滤器,只是为了与已知值不匹配,我需要所有其他过滤器,而不是那个。 (?!不需要)工作正常,谢谢。 :-)
我希望这可以澄清这个问题:)
解决方案
(?!Andrea).{6}
假设regexp引擎支持负前瞻。
编辑:..或者我们可能更喜欢使用[A-Za-z] {6}
代替。{6}
。
编辑(再次):请注意,先行查找和后向查找通常不是"逆向"正则表达式匹配的正确方法。正则表达式不是为负匹配而设置的,而是将其留给我们使用它们的任何语言。
否定超前断言
(?!Andrea)
这并不是完全相反的匹配,但这是我们可以直接使用正则表达式进行的最佳操作。并非所有平台都支持它们。
我们使用什么语言?正则表达式实现的功能和语法对此很重要。
我们可以使用预读。以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的所有行,并通过第二个正则表达式检查它们是否包含6个字符。或者首先检查至少6个单词字符,然后检查它是否与Andrea不匹配。
在perl中,我们可以做
process($ line)if($ line =〜!/ Andrea /);
如果要在RegexBuddy中执行此操作,可以通过两种方法来获取所有不匹配正则表达式的行的列表。
在"测试"面板上的工具栏上,将测试范围设置为"逐行"。当我们执行此操作时,将在同一工具栏上的"全部列出"按钮下方显示一个项目"列出所有不匹配的行"。 (如果看不到"全部列出"按钮,请单击主工具栏中的"匹配"按钮。)
在GREP面板上,可以打开"基于行"和"反转结果"复选框,以获取要复制的文件中不匹配的行的列表。
对于Python / Java,
^(.(?!(some text)))*$
http://www.lisnichenko.com/articles/javapython-inverse-regex.html