繁体   English   中英

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

[英]Regex to match all lines not starting with ==

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

^ [^ \\ = \\ =]。*

在我使用的正则表达式测试器中可以正常工作,但是当我运行perl脚本时,出现错误消息:

POSIX语法[= =]保留用于正则表达式中的将来扩展

脚本终止。 我以为我使用的语法错误,但是我对此一无所获。 有谁有更好的方法来匹配这些线?

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

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

字符类是用方括号分隔[...]一般将匹配它包围的任何一个字符。 因此[abc]将匹配abc ,但仅匹配aacbc的第一个字符。 您可能知道您也可以使用range ,例如[ac]

您也可以像这样对否定类进行否定 ,因此[^a]将匹配不是 a任何字符,例如z& ,但仅匹配zz的第一个字符

在类中复制字符不会更改其匹配项,因此[aardvark]将完全匹配adkrv ,并且等效于[adkrv]

您的正则表达式模式使用字符类[^\\=\\=] 不必转义等号,并且对其进行复制没有任何作用,因此您具有等价的[^=] ,它将匹配等号=以外的任何单个字符

收到该错误消息的原因是,字符类以[=和结束=] (只是[=]不计算在内)保留给尚未实现的特殊行为。 如上所述,通常无需编写多次出现相同字符的字符类,因此合理的做法是禁止这样的构造

perldoc perldiag有这个话要说

POSIX语法[= =]保留用于正则表达式中的将来扩展。 以<-HERE标记,以m /%s /

(F)在正则表达式字符类([])中,以“ [=”开头和以“ =]结尾”的语法保留给以后的扩展。 如果需要在正则表达式字符类中表示这些字符序列,只需在方括号中加上反斜杠:“ [=“和” =]“。 <-HERE在正则表达式中显示发现问题的行踪。 参见perlre

一个解决方案取决于您想在Perl代码中使用测试的方式,但是如果您需要if语句,那么我将简单地反转测试并检查该行不是==开头

unless ( /^==/ )

或者,如果您对Perl过敏, unless

if ( not /^==/ )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM