代码之家  ›  专栏  ›  技术社区  ›  Rob Wells

为什么在这个regexp中匹配空白行?

  •  1
  • Rob Wells  · 技术社区  · 16 年前

    G'Day.

    我使用以下Perl片段从Solaris集群命令中提取输出。

    open(CL,"$clrg status |");
    my @clrg= grep /^[[:lower:][:space:]]+/,<CL>;
    close(CL);
    

    打印数组@clrg btw“=>”和“<=”行分隔符的内容时,我的print语句将插入以下内容:

    =><=
    =>nas-rg             mcs0.cwwtf.bbc.co.uk   No          Online<=
    =>                   mcs1.cwwtf.bbc.co.uk   No          Offline<=
    =><=
    =>apache-rg          mcs0.cwwtf.bbc.co.uk   No          Online<=
    =>                   mcs1.cwwtf.bbc.co.uk   No          Offline<=
    =><=
    

    当我用下面的Perl片段替换它时,空行不匹配。

    open(CL,"$clrg status |");
    my @clrg= grep /^[[:lower:][:space:]]{3,}/,<CL>;
    close(CL);
    

    我得到以下信息:

    =>nas-rg             mcs0.cwwtf.bbc.co.uk   No          Online<=
    =>                   mcs1.cwwtf.bbc.co.uk   No          Offline<=
    =>apache-rg          mcs0.cwwtf.bbc.co.uk   No          Online<=
    =>                   mcs1.cwwtf.bbc.co.uk   No          Offline<=
    

    简单的问题是为什么?

    btw在第二个perl片段中使用1,也匹配空白行!

    感谢您的建议!

    干杯,

    2 回复  |  直到 15 年前
        1
  •  9
  •   Brad Gilbert    15 年前

    那是因为 [:space:] 匹配换行符和回车符。

    所以 [[:space:]]+ 将匹配 \n , \r\n \n\n .

    但是 [[:space:]]{3,} 需要三个字符,空行只是 \n .

    {1,} + 意思相同:将前一组匹配一次或多次。

    P.S.一条典型的新线是 \n 在UNIX上 \rn 在Windows上。

        2
  •  1
  •   rjray    16 年前

    嗯,根据 Perl regular expression documentation , the [:space:] 字符类不应包含换行符,因为它应该与 \s (除了它可以识别一个额外的字符,即垂直标签,以保持POSIX遵从性)。

    然而 我刚刚在5.10.0上测试过这个函数,我可以验证它是否也匹配换行符。无论这在Perl中还是在文档中都是一个bug,我将留给Perl维护人员。但是为了避免直接的问题,使用之前的回答者的解决方案,并且只使用 的S 而不是posix类。