【发布时间】:2015-04-14 09:05:37
【问题描述】:
我试图匹配一个反斜杠,后跟一个转义字符,如 t、n、r 或 \.. 就像在 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 会失败。我认为这将是正确的正则表达式。我在这里错过了什么?
【问题讨论】: