无与伦比[在正则表达式,尽管被逃脱

时间:2015-01-23 18:52:44

标签: regex perl

尝试测试位置函数和解析perl的能力。我有一个正则表达式,我认为是正确的,但perl告诉我,我有一个无与伦比的[,但对我来说它看起来逃脱了。

  

无与伦比[正则表达式;标记为< - HERE in m / \ G。* [([< - HERE ^] +)] / at perltest.pl第5行。

任何人都可以澄清为什么我从以下代码中获取该消息?

my $string = "one, [two] , [three], and [four].";

pos($string) = 0;
while (my $string =~ m{\G.*\[([^\]+)\]}cg)
{
    my $value = $1;
    print "Found value $value .\n";
};

5 个答案:

答案 0 :(得分:5)

否定的字符类不会终止。

你在哪里

[^\]+    # One or more characters that aren't «]», «+», ...
你应该

[^\]]+   # One or more characters that aren't «]»

我甚至会使用

[^[\]]*  # Zero or more characters that aren't «[» or «]»

答案 1 :(得分:3)

错误来自于不完整的字符类......

\G.*\[([^\] +)\]
           ^

要解决此问题,您需要添加一个结束括号来完成该课程。

\G.*\[([^\]]+)\]
           ^

我建议以下内容,同时将+更改为*以匹配“零或更多”。

[^]]*

答案 2 :(得分:2)

你只逃脱了4个中的3个。

m{\G.*\[([^\]+)\]}cg)
       ^    ^   ^
         ^ - not escaped

答案 3 :(得分:2)

解释问题的正则表达式:

m{\G.*\[([^\]+)\]}cg

这个正则表达式是一个转义的perl正则表达式。 未转义的正则表达式是:\G.*\[([^\]+)\]

正则表达式:\G.*\[([^\]+)\]确实:

  • \G ...断言位置位于上一场比赛的结尾或字符串的开头。
  • .* ...匹配任何不是换行符的字符,介于零和无限次之间。 (贪婪)
  • \[ ...匹配角色[

现在正在处理正则表达式,有一个开头的paranthesis没有关闭paranthesis 这是因为在打开paranthesis (之后会出现一个字符类[,需要在关闭的paranthesis )之前关闭。 虽然有一个\]这是一个转义的],因此不是字符类的结束括号。
因此正则表达式中的)是打开的字符类的一部分 由于上一个]也被转义,因此捕获组和字符类都不会被关闭。

在Perl正则表达式中,]不需要转义 不得转义字符类的结尾。

如果\[([^\]+)\]旨在匹配[]之间的所有字符,并将其值捕获到捕获组1,则更正的部分为:\[([^\]]+)\]或更短{{ 1}}

所以最接近的正则表达式是:

\[([^]]+)]

可以缩短为

\G.*\[([^\]]+)\]

如果您想匹配\G.*\[([^]]+)] twothree

four

答案 4 :(得分:0)

您可能会发现向正则表达式添加空格以使其更具可读性可以帮助您了解正在发生的事情。另外你在那里有太多“我的$ string”: - )

my $string = "one, [two] , [three], and [four].";

while ($string =~ m{
        \G.*
        \[
            (  [^\]]+  )
        \]
    }cgx)
{
    my $value = $1;
    print "Found value $value .\n";
};