我正在逐行处理一个文件,我想做一个反向匹配。例如,我想匹配有六个字母的字符串的行,但前提是这六个字母不是' Andrea '。我该怎么做?
我正在使用RegexBuddy,但仍然遇到问题。
我正在逐行处理一个文件,我想做一个反向匹配。例如,我想匹配有六个字母的字符串的行,但前提是这六个字母不是' Andrea '。我该怎么做?
我正在使用RegexBuddy,但仍然遇到问题。
(?!Andrea).{6}
假设您的正则表达式引擎支持负前瞻...
...或者您可能更愿意[A-Za-z]{6}
使用.{6}
请注意,前瞻和后瞻通常不是“反转”正则表达式匹配的正确方法。正则表达式并不是真正为进行否定匹配而设置的;他们将其留给您使用的任何语言。
对于 Python/Java,
^(.(?!(some text)))*$
http://www.lisnichenko.com/articles/javapython-inverse-regex.html
正则表达式实现的功能和语法很重要。
你可以使用前瞻。以 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不匹配。
如果您想在 RegexBuddy 中执行此操作,有两种方法可以获取与正则表达式不匹配的所有行的列表。
在“测试”面板的工具栏上,将测试范围设置为“逐行”。当你这样做时,一个项目列出所有没有匹配的行将出现在同一工具栏上的列出所有按钮下。(如果您没有看到“列出所有”按钮,请单击主工具栏中的“匹配”按钮。)
在 GREP 面板上,您可以打开“基于行”和“反转结果”复选框,以获取您正在浏览的文件中不匹配行的列表。
我刚刚想出了这种可能是硬件密集型的方法,但它正在工作:
您可以用空字符串替换与正则表达式匹配的所有字符。
这是一个单行:
notMatched = re.sub(regex, "", string)
我之所以使用它是因为我被迫使用一个非常复杂的正则表达式,并且无法弄清楚如何在合理的时间内反转它的每个部分。
这只会返回字符串结果,而不是任何匹配对象!
在 Perl 中,您可以:
process($line) if ($line =~ !/Andrea/);