Perl正则表达式帮助:字符集,字面反斜杠,引号字符

时间:2014-08-22 20:41:02

标签: regex perl

我有一个文本文件,我想确定哪些行包含反斜杠,后跟小写字母“n”或双引号字符。以下内容对我不起作用。有人请解释原因吗?谢谢!

my $pattern='\\[n"]';
if ($text =~ /$pattern/) {
    # Do stuff...
}

3 个答案:

答案 0 :(得分:3)

在单引号内,除了嵌入的单引号或字符串末尾的反斜杠外,不需要转义任何字符。然而,的反斜杠被认为是第一个逃避第二个反斜杠,所以

my $pattern='\\[n"]'

相同
my $pattern='\[n"]'

我希望您现在可以看到,如果您使用/$pattern/将其编译为正则表达式,则反斜杠现在将转义左方括号[

正则表达式中您想要的是/\\[n"]/,因此您需要$pattern字符串中的两个反斜杠。

因为每对反斜杠中的一个被作为一个转义被吃掉,你需要在原始字符串中使用四个才能让事情发挥作用,就像这样

my $pattern='\\\\[n"]'

正确生成六个字符的字符串\\[n"]。现在,您的匹配/$pattern/将执行您想要的操作。

答案 1 :(得分:2)

因为正则表达式将反斜杠解释为将括号转义为字符类。

它等同于该行:

if ($text =~ /\[n"]/) {

最简单的解决方案是使用qr来定义您的模式:

my $text = "\\n";

my $pattern = qr{\\[n"]};

if ($text =~ /$pattern/) {
    print "bingo";
}

输出:

bingo

答案 2 :(得分:0)

use strict;
use warnings;

my $pattern = qr!\\[n"]!;

while( my $line = <DATA>) {   
    if( $line =~ $pattern ) {
        print $line;
    }
}

__DATA__
1: yes\n
2: no \=
3: yes\"

打印:

1: yes\n
3: yes\"