代码之家  ›  专栏  ›  技术社区  ›  Arkaitz Jimenez

为什么我的regex无法匹配版本号?

  •  3
  • Arkaitz Jimenez  · 技术社区  · 16 年前

    我遇到了PerlRegex与网络脚本的匹配问题,我设法将行为放在一个小片段中。

    以下面这个Perl5.10.0的Perl代码段为例:

    #!/usr/bin/perl
    use warnings;
    use strict;
    
    my $line = "Version: 0\r\n";
    my($version) = $line =~ m/^Version:(\s\d+)\r\n$/;
    print "1st failed \n" if not $version; 
    ($version) = $line =~ m/^Version:\s(\d+)\r\n$/;
    print "2nd failed \n" if not $version; 
    ($version) = $line =~ m/^Version:\ (\d+)\r\n$/;
    print "3th failed \n" if not $version; 
    

    使用此输出:

    2nd failed
    3th failed 
    

    显然,第一个和第二个之间的唯一区别是将空间移出提取的模式,理论上不应该修改regex,只修改返回的部分。

    我不明白为什么第二和第三个和第一个不完全一样。

    编辑: 如果您删除$version中的括号不是同一个脚本,则不会得到匹配的结果,您会得到op的布尔结果,要得到匹配的结果,您需要在一元(只有一个字符串匹配)元组中接收它。

    2 回复  |  直到 16 年前
        1
  •  12
  •   chaos    16 年前

    问题是,您正在测试布尔值true,因为在后两种情况下,您提取的字符串值是false(string '0' )试试这个:

    $line = "Version: 0\r\n";
    my $version;
    ($version) = $line =~ m/^Version:(\s\d+)\r\n$/;
    print "1st failed \n" unless defined $version;
    ($version) = $line =~ m/^Version:\s(\d+)\r\n$/;
    print "2nd failed \n" unless defined $version;
    ($version) = $line =~ m/^Version:\ (\d+)\r\n$/;
    print "3th failed \n" unless defined $version;
    
        2
  •  2
  •   brian d foy    16 年前

    您没有测试match操作符。如果要查看匹配是否失败,请测试匹配:

     if( $line =~ m/(...)/ ) {
        $version = $1;
        }
    

    您至少可以在调试时检查,以将问题缩小到失败的部分。

    使用不同的数据,例如:

     Version: 1\r\n
    

    会向您展示不同的行为,您可能会注意到,如果仅在版本为0时失败。那可能会点燃你脑袋里的灯泡:)