无与伦比[在正则表达式;

时间:2018-05-20 00:51:47

标签: perl

当我运行我的代码时,这一条特定的行会导致问题。我很确定这是一个简单的修复,但我对perl很新,不确定如何解决它。

if (/^([.+\])\s*$/) {

有问题的一行。它告诉我[是无与伦比的,希望能解决这个问题非常简单。提前感谢您提供任何解决方案。

2 个答案:

答案 0 :(得分:2)

正则表达式只包含character class [...]的左括号,因为其他括号已转义\],因此指定了文字]字符。这是一个语法错误,它正是错误消息所说的内容。

如果要匹配文字括号内的任何字符,请转义第一个

/^( \[ .+ \] )\s*$/x

这匹配一个字符串,其中包含一对文字[]内的所有字符,可能后跟空格。请注意,这可能包含嵌套[] - 因为+ "greedy" .+\]匹配尽可能多,所以直到最后]字符串(和括号)。如果不希望这样,请使用匹配第一个.+?\](和括号)的]。感谢Borodin发表评论。

我使用/x修饰符,因为它会忽略空格,因此可用于提高可读性。

或者你想要角色类,在这种情况下,结束括号不应该被转义

/^( [.+] )\s*$/x

匹配仅包含句点.或加号+的字符串以及可能的尾随空格。 (.+在字符类中没有特殊含义。)

另一个猜测是,您希望匹配.+\,在这种情况下,反斜杠本身需要转义

/^( [.+\\] )\s*$/x

answer by Zan Lynx

中提到

\have a special meaning中为数不多的几个字符之一  在角色类中。

请首先尝试在问题中指定所有相关信息。

答案 1 :(得分:1)

您通过写\]来转义结束括号。如果你想在你的角色类中使用反斜杠,请使用两个。

像这样:

#!/usr/bin/env perl

use strict;

while(<>) {
        chomp;
        if (/^([.+\\])\s*$/) {
                print "matched\n";
        }
}