更新版本的Perl上的正则表达式匹配问题

时间:2017-06-13 08:49:15

标签: regex perl

我已经转移到新服务器, Perl 5.22.1 。我有这段代码:

$html =~ m{
    ( # $1 the whole tag
        <
        (
            ?:
            !--
            ( # $2 the attributes are all the data between
                .*?
            )
            --
            | # or
            (
                ?:
                ( # $3 the name of the tag
                    /?\S+?\b
                )
                ( # $4 the attributes
                    [^'">]*
                    (
                        ?:
                        ( # $5 just to match quotes
                            ['"]
                        )
                        .*?\5
                        [^'">]*
                    )*
                )
            )
        )
        >
    )
}gsx

...现在它给了我这个错误:

A fatal error has occurred:

    In '(?...)', the '(' and '?' must be adjacent in regex; marked by <-- HERE in m/
                ( # $1 the whole tag
                    <
                    (
                        ? <-- HERE :
                        !--
                        ( # $2 the attributes are all the data between
                            .*?
                        )
                        --
                        | # or
                        (
                            ?:
                            ( # $3 the name of the tag
                                /?\S+?\b
                            )
                            ( # $4 the attributes
                                [^'">]*
                                (
                                    ?:
                                    ( # $5 just to match quotes
                                        ['"]
                                    )
                                    .*?\5
                                    [^'">]*
                                )*
                            )
                        )
                    )
                    >
                )
            / at ./admin/GT/HTML/Parser.pm line 207.
    Compilation failed in require at (eval 25) line 8.

Please enable debugging in setup for more details.

我不确定它在抱怨什么。有什么想法吗?

1 个答案:

答案 0 :(得分:5)

即使使用?:修饰符,您也需要确保x(非捕获组标记)在左括号 后立即

参见固定的正则表达式声明:

$html =~ m{
    ( # $1 the whole tag
        <
        (?:
            !--
            ( # $2 the attributes are all the data between
                .*?
            )
            --
            | # or
            (?:
                ( # $3 the name of the tag
                    /?\S+?\b
                )
                ( # $4 the attributes
                    [^'">]*
                    (?:
                        ( # $5 just to match quotes
                            ['"]
                        )
                        .*?\5
                        [^'">]*
                    )*
                )
            )
        )
        >
    )
}gsx

请参阅this reference

  

请注意\Q...\E内的所有内容均不受/x的影响。请注意,/x不会影响单个多字符构造中的空间解释。例如,在\x{...}中,无论/x修饰符如何,都不能有空格。对于{3}{5,}等量词也是如此。 同样,(?:...)"{""?"":" 之间不能有空格。在这种构造的任何分隔符内,允许的空格不受/x的影响,并且取决于构造。例如,\x{...}不能包含空格,因为十六进制数字中没有空格。

我认为有一个拼写错误 - {必须是(。我加粗了与当前场景相关的部分文本。