代码之家  ›  专栏  ›  技术社区  ›  Geo

如何使这个Perl regex工作?

  •  4
  • Geo  · 技术社区  · 15 年前

    /Od /D "WIN32" /D "_DEBUG" /FD /EHa /MDd /Fo"Debug" /Fd"Debug\vc80.pdb" /W3 /c /Zi /clr /TP .\main.cpp"
    

    我想提取 .\main.cpp . 我想下面的方法就可以了:

    if($string =~ /.*\s+(.*)$/i) {
     print "matched ",$1,"\n";
    }
    

    编辑:以下是如何设置字符串:

    for(find_indexes(\@lines,"/MDd")) {
        my $actual_line = $lines[$_];
        $actual_line    = modify($actual_line,$additional_defs);
    }
    

    find_indexes modify sub将返回发送给它的字符串的修改版本,其中包含一些附加的定义。

    编辑2:这是最新的消息 修改 附属的:

    sub modify {
        my $string      = shift;
        chomp($string);
        my @defines     = @_;
        if($string =~ /.*\s+(\".*?)$/) {
            my $match = $1;
            print "match is $match";
            my $string_copy = $string;
            print "|$string_copy|\n";
        }
    }
    

    $string_copy 打印|包围的原始字符串。然而,我只得到了引导管道,而不是结束一个。我想Perl可能是错误地解释了插值变量,我试着这样做:

    print "|",$string_copy,"|\n";
    

    但我还是只得到一根管子。这让我觉得这根弦确实出了问题。我想不出别的了。

    4 回复  |  直到 15 年前
        1
  •  2
  •   Paul    15 年前
    my $string = '/Od /D "WIN32" /D "_DEBUG" /FD /EHa /MDd /Fo"Debug" /Fd"Debug\vc80.pdb" /W3 /c /Zi /clr /TP .\main.cpp"';
    if($string =~ /.*\s+(.*)$/i) {
        print "matched ",$1,"\n";
    }
    

    这对我很有用 matched .\main.cpp" .

    请展示一下你是怎么设置的 $string . 有可能是你弄错了引语什么的。

    \x0d 字符串末尾的符号?当您打印字符串并 chomp 不会删除它:

    my $string = '/Od /D "WIN32" /D "_DEBUG" /FD /EHa /MDd /Fo"Debug" /Fd"Debug\vc80.pdb" /W3 /c /Zi /clr /TP .\main.cpp"' . "\x0d";
    chomp $string;
    if($string =~ /.*\s+(.*)$/i) {
        print "matched ",$1,"\n";
    }
    

    这个指纹 matched 对我来说,没有捕获文件名。也许这就是你的案子?

    C:\>perl --version
    
    This is perl, v5.10.1 built for MSWin32-x64-multi-thread
    
        2
  •  2
  •   Michael Carman    15 年前

    领头羊 .* 是毫无意义的,就像 /i 修饰语。

    如果字符串以换行符结尾,则将由 \s+ . 自从 (.*) 接下来的比赛什么也比不上,但比赛会成功 $1 将为空。相反,强制它匹配某些内容: /(\S+)"$/

        3
  •  1
  •   hobbs    15 年前

    事实上 想要的是

    $string =~ /(\S+)$/
    
        4
  •  0
  •   sholsapp    15 年前

    试试这个:

    #!/usr/bin/perl
    
    $string = <STDIN>;
    chomp($string);
    print $string;
    
    if($string =~ /.*\s+(.*)$/) {
      print "\nmatched ",$1,"\n";
    }