这些Perl语句存在什么问题?正则报错:未转义左大括号已弃用
你的Perl正则语句问题分析与修复方案
嘿,我来帮你拆解这个问题~先看你收到的报错信息:
第二行错误为:正则表达式中未转义的左大括号已被弃用,已在正则中直接传递;在clean.pl第34行的m/{{ <-- HERE [^}]*}}/处标记。
问题就出在这条替换语句上:s/{{[^}]*}}//g;
在Perl的正则规则里,{是个特殊元字符——它用来定义重复次数的量词(比如x{2,5}表示匹配2到5个连续的x)。当你直接写{{的时候,Perl会把第一个{当成量词的起始符号,但这里后面没有跟着合法的数字范围,自然就触发了语法错误,而且这种直接使用未转义大括号的写法现在已经被Perl弃用了。
修复方案
最直接的解决办法就是把正则里的大括号转义,用反斜杠\来告诉Perl:“这就是普通的大括号,不是量词语法”。修改后的代码如下:
s/\[\[[a-z\-]*:[^\]]*\]\]//g; s/\[\[[^\|\]]*\|/[[/g; # 从XML脚本中移除{{icons}}和{tables} s/\{\{[^}]*\}\}//g;
如果你觉得一个个转义麻烦,也可以用\Q和\E包裹需要当作普通字符处理的部分(不过这里因为中间的[^}]*需要保留正则的匹配逻辑,所以只转义大括号更精准):
s/\Q{{\E[^}]*\Q}}\E//g;
额外小提示
以后写正则遇到和语法元字符重名的普通字符时,记得先转义,或者选择和目标字符不冲突的正则分隔符(比如把s///改成s###,不过大括号的话转义还是最直观的)。
内容的提问来源于stack exchange,提问作者Aneesh Mullapudi
相关产品推荐
相关产品推荐

