And*_*mbu 100 regex inverse-match
我正在使用RegexBuddy,但无论如何我都遇到了麻烦:
我正在逐行处理一个文件.我建立了一个"线型"来匹配我想要的东西.
现在我想做一个反向匹配...即我想匹配有6个字母的字符串,但只有这六个字母不是 Andrea,我该怎么做?
编辑:我会编写使用这个正则表达式的程序,我不知道如果在python或php中,我首先要做的事情是学习一些正则表达式:)有不同类型的行,我想用正则表达式选择我感兴趣的类型.一旦我得到这些行,我将应用另一个过滤器只是为了与已知值不匹配,我需要所有其他的,而不是那个.(?!not-wanted)工作得很好,谢谢.:-)
我希望这澄清了这个问题:)
Dan*_*Dan 66
(?!Andrea).{6}
Run Code Online (Sandbox Code Playgroud)
假设你的正则表达式引擎支持负向前瞻...
编辑:..或者你可能更喜欢用[A-Za-z]{6}它代替.{6}
编辑(再次):请注意,前瞻和后瞻通常不是"反转"正则表达式匹配的正确方法.Regexs并不是真正用于进行负匹配,而是将它留给你使用它们的任何语言.
小智 47
对于Python/Java,
^(.(?!(some text)))*$
Run Code Online (Sandbox Code Playgroud)
http://www.lisnichenko.com/articles/javapython-inverse-regex.html
Zen*_*xer 18
更新了Alan Moore的反馈
在PCRE和类似的变体中,您实际上可以创建一个匹配任何不包含值的行的正则表达式:
^(?:(?!Andrea).)*$
Run Code Online (Sandbox Code Playgroud)
这被称为驯化贪婪令牌.缺点是它表现不佳.
Ham*_*ner 11
你用的是哪种语言?正则表达式实现的功能和语法对此非常重要.
你可以使用预测.以python为例
import re
not_andrea = re.compile('(?!Andrea)\w{6}', re.IGNORECASE)
Run Code Online (Sandbox Code Playgroud)
打破这种情况:
(?!Andrea)的意思是'匹配,如果接下来的6个字符不是"Andrea"'; 如果是的话
\ w表示"单词字符" - 字母数字字符.这等同于[a-zA-Z0-9_]类
\ w {6}表示正好是6个字的字符.
re.IGNORECASE意味着你将排除"Andrea","andrea","ANDREA"......
另一种方法是使用你的程序逻辑 - 使用不匹配Andrea的所有行,并通过第二个正则表达式来检查6个字符.或者首先检查至少6个单词字符,然后检查它是否与Andrea不匹配.
如果要在RegexBuddy中执行此操作,有两种方法可以获取所有不匹配正则表达式的行的列表。
在“测试”面板上的工具栏上,将测试范围设置为“逐行”。当您执行此操作时,将在同一工具栏上的“全部列出”按钮下出现“列出所有不匹配的行”的项目。(如果看不到“全部列出”按钮,请单击主工具栏中的“匹配”按钮。)
在GREP面板上,可以打开“基于行”和“反转结果”复选框,以获取要复制的文件中不匹配的行的列表。
我刚刚想出了这个方法,它可能是硬件密集型的,但它有效:
您可以用空字符串替换与正则表达式匹配的所有字符。
这是一个单线:
notMatched = re.sub(regex, "", string)
我使用它是因为我被迫使用非常复杂的正则表达式,并且无法弄清楚如何在合理的时间内反转它的每个部分。
这只会返回字符串结果,而不返回任何匹配对象!