正则表达式匹配所有不以==开头的行

时间:2017-07-11 19:31:43

标签: regex perl

这应该很简单,但我一直遇到麻烦。我想在perl中编写一个正则表达式来匹配所有不以“==”开头的行。我创建了这个表达式:

^ [^ \ = \ =]。*

在我使用的正则表达式测试程序中可以正常工作,但是当我运行perl脚本时,我收到一条错误说明:

POSIX语法[= =]保留用于regex中的未来扩展

脚本终止。我假设我使用了一些语法错误,但我没有找到任何关于此的内容。有没有人有更好的方法来匹配这些线?

2 个答案:

答案 0 :(得分:3)

您的正则表达式不正确,因为它以=A为输入失败,例如。 一种方法是使用Perl兼容正则表达式(PCRE):^(?!==)

答案 1 :(得分:2)

您误解了字符类在正则表达式中的工作方式

字符类由方括号[...]分隔,通常与它所包含的字符中的任何一个匹配。因此[abc]将匹配abc,但只会匹配aacbc的第一个字符。您可能知道也可以使用范围,例如[a-c]

您也可以否定该课程,因此[^a]将匹配不是 {{1}的任何一个字符},例如az,但只有&的第一个字符

复制班级中的字符不会改变匹配的内容,因此zz将完全匹配[aardvark]adk中的一个或r,相当于v

您的正则表达式模式使用字符类[adkrv]。没有必要逃避等号,并且复制它没有任何效果,所以你有[^\=\=]的等价物,它将匹配除等号[^=]以外的任何单个字符

您收到该错误消息的原因是,开始=和结束[=的字符类(仅=]不计数)保留用于尚未实现的特殊行为。如上所述,通常没有理由写出多次出现相同字符的字符类,因此不允许这样的结构是合理的

perldoc perldiag有这个说法

  

POSIX语法[= =]保留用于regex中的未来扩展;标记为< - HERE,单位为m /%s /

     

(F)在正则表达式字符类([])中,语法以" [="并以" =]&#34结束;保留用于将来的扩展。如果需要在正则表达式字符类中表示这些字符序列,只需使用反斜杠引用方括号:" [="和" =]"。 < - HERE显示了正则表达式中发现问题的位置。请参阅perlre

解决方案取决于您希望如何在Perl代码中使用测试,但如果您需要[=]语句,那么我只需反转测试并检查行不是if

开头
==

或者,如果您对Perl unless ( /^==/ )

过敏
unless