[英]Regex to match all lines not starting with ==
这应该很简单,但是我遇到了麻烦。 我想在perl中写一个正则表达式来匹配所有不以“ ==”开头的行。 我创建了这个表达式:
^ [^ \\ = \\ =]。*
在我使用的正则表达式测试器中可以正常工作,但是当我运行perl脚本时,出现错误消息:
POSIX语法[= =]保留用于正则表达式中的将来扩展
脚本终止。 我以为我使用的语法错误,但是我对此一无所获。 有谁有更好的方法来匹配这些线?
您的正则表达式是不正确的,例如,由于它以=A
作为输入而失败。 一种方法是使用Perl兼容的正则表达式(PCRE): ^(?!==)
您误会了字符类在正则表达式中的工作方式
字符类是用方括号分隔[...]
一般将匹配它包围的任何一个字符。 因此[abc]
将匹配a
, b
或c
,但仅匹配aa
或cbc
的第一个字符。 您可能知道您也可以使用range ,例如[ac]
您也可以像这样对否定类进行否定 ,因此[^a]
将匹配不是 a
任何字符,例如z
或&
,但仅匹配zz
的第一个字符
在类中复制字符不会更改其匹配项,因此[aardvark]
将完全匹配a
, d
, k
, r
或v
,并且等效于[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.