如何在正则表达式中匹配“/ *”?

时间:2009-12-12 11:03:28

标签: regex perl

$stuff = "d:/learning/perl/tmp.txt";

open STUFF, $stuff or die "Cannot open $stuff for read :$!";
while (<STUFF>) {
    my($line) = $_; # Good practice to always strip the trailing
    chomp($line);
    my @values = split(' ', $line);

    foreach my $val (@values) {

        if ($val == 1){
            print "1 found";    
        }
        elsif ($val =~ /hello/){
            print "hello found";    
        }
        elsif ($val =~ /"/*"/){ # I don't know how to handle here.
            print "/* found";    
        }
        print "\n";
    }
}

我的tmp.txt

/* CheerStone ColdStunner 

1 Cheer Rock

hello Boo Pedigree

如何处理代码中的/*字符序列?

3 个答案:

答案 0 :(得分:16)

*是一个特殊字符。所以,你必须逃脱它:

m{/\*}

正如Adam Bellaire建议的那样,这里有一个简短的解释:

最好避免使用栅栏。为此,有时必须使用/以外的分隔符。使用此类分隔符时,m应位于第一个分隔符之前。如果任何括号用作第一个分隔符,则必须使用相应的右括号作为结束分隔符。

答案 1 :(得分:12)

un-meta正则表达式元字符有多种方法。在您的情况下,您需要处理作为默认分隔符的字符以及元字符。

  • 如果你想成为一个文字字符的分隔符,你可以用\来转义那个字符,虽然你可以得到leaning toothpick syndrome

    m/\/usr\/local\/perls/;
    
  • 您可以更改分隔符:

    m(/usr/local/perl);
    
  • 您可以以相同的方式转义元字符:

    m(/usr/local/perl\*);
    
  • 如果您希望模式的某个部分只是文字字符,则可以使用\Q为您自动转义它们:

    m(\Q/usr/local/perl*);
    
  • 如果您希望模式的较小部分仅为文字字符,则可以使用\Q然后使用\E将其关闭:

    m(/usr/local/perl\Q*+?\E/);
    
  • \Qquotemeta完全相同。将模式放入变量然后在匹配运算符中进行插值也可以解决分隔符问题:

    my $pattern = quotemeta( '/usr/local/perl*+?/' );
    m/$pattern/;
    

答案 2 :(得分:8)

两个字符在Perl正则表达式中都有特殊含义,因此您必须使用反斜杠转义它们:

$val =~ /\/\*/
不过,您应该在所有正则表达式前添加^,因为您似乎只想处理该行开头的文本。