当前位置:  开发笔记 > 编程语言 > 正文

如何与正则表达式"反向匹配"?

如何解决《如何与正则表达式"反向匹配"?》经验,为你挑选了7个好方法。

我正在使用RegexBuddy,但无论如何我都遇到了麻烦:

我正在逐行处理一个文件.我建立了一个"线型"来匹配我想要的东西.

现在我想做一个反向匹配...即我想匹配有6个字母的字符串,但只有这六个字母不是 Andrea,我该怎么做?


编辑:我会编写使用这个正则表达式的程序,我不知道如果在python或php中,我首先要做的事情是学习一些正则表达式:)有不同类型的行,我想用正则表达式选择我感兴趣的类型.一旦我得到这些行,我将应用另一个过滤器只是为了与已知值不匹配,我需要所有其他的,而不是那个.(?!not-wanted)工作得很好,谢谢.:-)

我希望这澄清了这个问题:)



1> Dan..:
(?!Andrea).{6}

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

编辑:..或者你可能更喜欢用[A-Za-z]{6}它代替.{6}

编辑(再次):请注意,前瞻和后瞻通常不是"反转"正则表达式匹配的正确方法.Regexs并不是真正用于进行负匹配,而是将它留给你使用它们的任何语言.


.默认情况下不匹配\n(某些语言[例如Perl]允许您打开该行为,但默认情况下.匹配所有内容但是\n).

2> 小智..:

对于Python/Java,

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

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


这行不通。您正在考虑脾气暴躁的令牌习语。但该点必须在* looka *之后,而不是之前。参见[这个问题](http://stackoverflow.com/questions/30900794/tempered-greedy-token-what-is-different-about-placing-the-dot-before-the-negat)。但是无论如何,这种方法对于这个任务来说是过大的。

3> Zenexer..:

更新了Alan Moore的反馈

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

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

这被称为驯化贪婪令牌.缺点是它表现不佳.



4> Hamish Downe..:

你用的是哪种语言?正则表达式实现的功能和语法对此非常重要.

你可以使用预测.以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不匹配.



5> Vinko Vrsalo..:

否定先行断言

(?!Andrea)

这不是一个倒置的匹配,但它是你可以直接用正则表达式做的最好的.但并非所有平台都支持它们.



6> Jan Goyvaert..:

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

在“测试”面板上的工具栏上,将测试范围设置为“逐行”。当您执行此操作时,将在同一工具栏上的“全部列出”按钮下出现“列出所有不匹配的行”的项目。(如果看不到“全部列出”按钮,请单击主工具栏中的“匹配”按钮。)

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



7> weakish..:

(?!在实践中很有用。尽管严格来说,展望不是数学上定义的正则表达式。

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

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

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有