匹配反斜杠后跟转义字符

时间:2015-04-14 09:05:37

标签: regex perl

我正在尝试匹配反斜杠后跟一个转义字符,如tnr\ ..就像在JSON字符串中一样。为简化起见,只考虑\t\\ ..例如:

use feature qw(say);
use strict;
use warnings;
use Data::Dump qw(dump);

my @data = (
    [q{\t},    qr/\\t/],            #ok
    ["\\",     qr/\\/],             #ok
    ["\\",     qr/[\\]/],           #ok
    ["\t",     qr/\t/],             #ok
    ["\t",     qr/[\t]/],           #ok
    [q{\\\t},  qr/(\\[\\\t])*/],    #not ok
    [q{\\\t},  qr/(\\\\[\\\\t])*/ ],#ok
);

for my $i (0..$#data) {
    my ($str, $regex) = @{$data[$i]};
    my $match_result = ($str =~ /^$regex$/) ? "ok" : "not ok";
    say(
        "$i : "
         . dump( $str )
         . ' =~ '
         . dump( $regex )
         . ' : '
         . $match_result
     );
}

输出:

0 : "\\t" =~ qr/\\t/ : ok
1 : "\\" =~ qr/\\/ : ok
2 : "\\" =~ qr/[\\]/ : ok
3 : "\t" =~ qr/\t/ : ok
4 : "\t" =~ qr/[\t]/ : ok
5 : "\\\\t" =~ qr/(\\[\\\t])*/ : not ok
6 : "\\\\t" =~ qr/(\\\\[\\\\t])*/ : ok

问题是,为什么测试#5会失败。我认为这将是正确的正则表达式使用..我在这里错过了什么?

2 个答案:

答案 0 :(得分:3)

第5项是

q{\\\t} =~ qr/(\\[\\\t])*/

q{\\\t},相当于'\\\t'。在单引号字符串中,除了

之外,不需要转义任何内容
  • 分隔符
  • 紧接在结束分隔符之前的反斜杠或另一个反斜杠

同样,任何两个反斜杠的出现都被视为转义反斜杠。

所以'\\\t'是一个包含\ \ t的三个字符的字符串。

qr//的内容表现为双引号上下文,因此所有反斜杠都需要转义,并且可能会修改以下字符。

"(\\[\\\t])*"是八个字符的字符串,由( \ [ \ \t ] {{1}组成} )其中*\t - 制表符。因此,您的模式将匹配一个字符串,该字符串由反斜杠后跟制表符或反斜杠组成,所有字符串都重复零次或多次。

表示字符串中只有反斜杠和"\x09",因此无法匹配。

我希望有所帮助。底线是单引号内没有转义序列,除了保护反斜杠和分隔符,t表示正好反斜杠,小写字母t

答案 1 :(得分:1)

原因如下:

q{\\\t}

"\\\\t" 

这是3个字符,2个反斜杠后跟't'

您的正则表达式#5匹配arbritray数量的字符对(一个\后跟另一个\或<制表符>)

将此更改为

[q{\\\t},  qr/(\\[\\\t]*)*/],    #not ok

仍然不行,

但是

[q{\\\t},  qr/(\\[\\t]*)*/],    #ok

会起作用。

HTH 乔治