我正在使用RegexBuddy,但无论如何我都遇到了麻烦:
我正在逐行处理一个文件.我建立了一个"线型"来匹配我想要的东西.
现在我想做一个反向匹配...即我想匹配有6个字母的字符串,但只有这六个字母不是 Andrea,我该怎么做?
编辑:我会编写使用这个正则表达式的程序,我不知道如果在python或php中,我首先要做的事情是学习一些正则表达式:)有不同类型的行,我想用正则表达式选择我感兴趣的类型.一旦我得到这些行,我将应用另一个过滤器只是为了与已知值不匹配,我需要所有其他的,而不是那个.(?!not-wanted)工作得很好,谢谢.:-)
我希望这澄清了这个问题:)
(?!Andrea).{6}
假设你的正则表达式引擎支持负向前瞻...
编辑:..或者你可能更喜欢用[A-Za-z]{6}
它代替.{6}
编辑(再次):请注意,前瞻和后瞻通常不是"反转"正则表达式匹配的正确方法.Regexs并不是真正用于进行负匹配,而是将它留给你使用它们的任何语言.
对于Python/Java,
^(.(?!(some text)))*$
http://www.lisnichenko.com/articles/javapython-inverse-regex.html
更新了Alan Moore的反馈
在PCRE和类似的变体中,您实际上可以创建一个匹配任何不包含值的行的正则表达式:
^(?:(?!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不匹配.
否定先行断言
(?!Andrea)
这不是一个倒置的匹配,但它是你可以直接用正则表达式做的最好的.但并非所有平台都支持它们.
如果要在RegexBuddy中执行此操作,有两种方法可以获取所有不匹配正则表达式的行的列表。
在“测试”面板上的工具栏上,将测试范围设置为“逐行”。当您执行此操作时,将在同一工具栏上的“全部列出”按钮下出现“列出所有不匹配的行”的项目。(如果看不到“全部列出”按钮,请单击主工具栏中的“匹配”按钮。)
在GREP面板上,可以打开“基于行”和“反转结果”复选框,以获取要复制的文件中不匹配的行的列表。
(?!
在实践中很有用。尽管严格来说,展望不是数学上定义的正则表达式。
您可以手动编写一个反正则表达式。
这是一个自动计算结果的程序。其结果是机器生成的,通常比手写一个要复杂得多。但是结果有效。