137

我正在逐行处理一个文件,我想做一个反向匹配。例如,我想匹配有六个字母的字符串的行,但前提是这六个字母不是' Andrea '。我该怎么做?

我正在使用RegexBuddy,但仍然遇到问题。

4

9 回答 9

87
(?!Andrea).{6}

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

...或者您可能更愿意[A-Za-z]{6}使用.{6}

请注意,前瞻和后瞻通常不是“反转”正则表达式匹配的正确方法。正则表达式并不是真正为进行否定匹配而设置的;他们将其留给您使用的任何语言。

于 2008-10-02T20:28:46.700 回答
56

对于 Python/Java,

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

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

于 2009-12-15T19:57:06.583 回答
33

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

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

这叫做淬炼的贪婪令牌。缺点是表现不佳。

于 2016-08-09T09:06:59.817 回答
11

正则表达式实现的功能和语法很重要。

你可以使用前瞻。以 Python 为例,

import re

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

打破它:

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

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

\w{6}表示正好是六个单词字符。

re.IGNORECASE表示您将排除“Andrea”、“andrea”、“ANDREA”...

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

于 2008-10-02T20:41:10.820 回答
8

负前瞻断言

(?!Andrea)

这不完全是反向匹配,但它是您可以直接使用正则表达式的最佳选择。但并非所有平台都支持它们。

于 2008-10-02T20:32:44.867 回答
6

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

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

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

于 2008-12-31T07:44:06.117 回答
5

(?!在实践中很有用。虽然严格来说,向前看并不是数学上定义的正则表达式。

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

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

于 2014-11-28T16:12:28.467 回答
4

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

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

这是一个单行:

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

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

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

于 2017-05-31T14:19:35.523 回答
-4

在 Perl 中,您可以:

process($line) if ($line =~ !/Andrea/);
于 2008-10-02T20:56:07.010 回答