我正在逐行处理一个文件,并且想要进行反向匹配。例如,我希望匹配包含六个字母字符串的行,但仅当这些六个字母不是“Andrea”时才匹配。我该如何做?
我正在使用RegexBuddy,但仍然遇到困难。
我正在逐行处理一个文件,并且想要进行反向匹配。例如,我希望匹配包含六个字母字符串的行,但仅当这些六个字母不是“Andrea”时才匹配。我该如何做?
我正在使用RegexBuddy,但仍然遇到困难。
(?!Andrea).{6}
假设您的正则表达式引擎支持负向先行断言...
...或者您更喜欢使用[A-Za-z]{6}
代替.{6}
请注意,先行和后行断言通常不是“反转”正则表达式匹配的正确方式。正则表达式并没有真正设置用于执行负向匹配;它们将这一任务留给您使用它们的语言来处理。
对于Python/Java,
^(.(?!(some text)))*$
http://www.lisnichenko.com/articles/javapython-inverse-regex.html
some text
在行首,它将返回错误的结果。 - Zenexer[\s\S]
,在JavaScript中非常有用),您就不需要第一个点:^(?:(?!Andrea).)*$
。 - Alan Moore--exclude
的模式。我能够将其设置为忽略除了几个目录中的文件之外的所有内容。 - vintprox正则表达式实现的功能和语法都很重要。
你可以使用先行断言。以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 不匹配。
我刚想出了这种方法,虽然它可能会占用大量硬件资源,但它是有效的:
您可以通过一个空字符串替换所有与正则表达式匹配的字符。
这是一行代码:
notMatched = re.sub(regex, "", string)
我使用这种方法是因为我被迫使用非常复杂的正则表达式,并且无法在合理的时间内翻转它的每个部分。
这将仅返回字符串结果,而不是任何匹配对象!
(?!
在实践中非常有用。虽然严格来说,从前向后查找不是按照数学定义规定的正则表达式。
您可以手动编写反向正则表达式。
这里有一个程序可以自动计算结果。 其结果是机器生成的,通常比手写的更复杂。但是该结果有效。
^((?!yourRegex).)*
然后捕获您的正则表达式之后的所有内容:
(?<=yourRegex).*
这适用于大多数正则表达式。但是我发现一个问题,即当我在末尾使用量词如{2,4}时,就需要创造性地解决问题了。process($line) if ($line =~ !/Andrea/);