这应该很简单,但我一直遇到麻烦。我想在perl中编写一个正则表达式来匹配所有不以“==”开头的行。我创建了这个表达式:
^ [^ \ = \ =]。*
在我使用的正则表达式测试程序中可以正常工作,但是当我运行perl脚本时,我收到一条错误说明:
POSIX语法[= =]保留用于regex中的未来扩展
脚本终止。我假设我使用了一些语法错误,但我没有找到任何关于此的内容。有没有人有更好的方法来匹配这些线?
答案 0 :(得分:3)
您的正则表达式不正确,因为它以=A
为输入失败,例如。
一种方法是使用Perl兼容正则表达式(PCRE):^(?!==)
答案 1 :(得分:2)
您误解了字符类在正则表达式中的工作方式
字符类由方括号[...]
分隔,通常与它所包含的字符中的任何一个匹配。因此[abc]
将匹配a
,b
或c
,但只会匹配aa
或cbc
的第一个字符。您可能知道也可以使用范围,例如[a-c]
您也可以否定该课程,因此[^a]
将匹配不是 {{1}的任何一个字符},例如a
或z
,但只有&
的第一个字符
复制班级中的字符不会改变匹配的内容,因此zz
将完全匹配[aardvark]
,a
,d
,k
中的一个或r
,相当于v
您的正则表达式模式使用字符类[adkrv]
。没有必要逃避等号,并且复制它没有任何效果,所以你有[^\=\=]
的等价物,它将匹配除等号[^=]
以外的任何单个字符
您收到该错误消息的原因是,开始=
和结束[=
的字符类(仅=]
不计数)保留用于尚未实现的特殊行为。如上所述,通常没有理由写出多次出现相同字符的字符类,因此不允许这样的结构是合理的
perldoc perldiag
有这个说法
POSIX语法[= =]保留用于regex中的未来扩展;标记为< - HERE,单位为m /%s /
(F)在正则表达式字符类([])中,语法以" [="并以" =]&#34结束;保留用于将来的扩展。如果需要在正则表达式字符类中表示这些字符序列,只需使用反斜杠引用方括号:" [="和" =]"。 < - HERE显示了正则表达式中发现问题的位置。请参阅perlre。
解决方案取决于您希望如何在Perl代码中使用测试,但如果您需要[=]
语句,那么我只需反转测试并检查行不是以if
==
或者,如果您对Perl unless ( /^==/ )
unless