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

时间:2020-03-06 15:02:56  来源:igfitidea点击:

我正在使用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