我正试图匹配一个反斜杠,后面跟着一个转义字符,如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失败。我认为这将是对use..What的正确判断,我在这里失踪了吗?
发布于 2015-04-14 09:36:45
第5项是
q{\\\t} =~ qr/(\\[\\\t])*/q{\\\t},这相当于'\\\t'。在单引号字符串中,除了转义以外,不需要转义任何内容。
此外,两个反斜杠一起出现的任何情况都被视为转义反斜杠。
因此,'\\\t'是一个包含\ \ t的三字符字符串。
qr//的内容表现为双引号上下文,因此所有反斜杠都需要转义,并可能修改以下字符。
"(\\[\\\t])*"是由( \ [ \ \t ] ) *组成的八个字符字符串,其中\t是"\x09" -选项卡字符。因此,您的模式将匹配一个字符串,该字符串由反斜杠和制表符或反斜杠组成,所有这些字符串都重复了0次或更多次。字符串中只有反斜杠和t,因此不能匹配。
我希望这能帮上忙。底线是,除了保护反斜杠和分隔符之外,单引号中没有转义序列,而'\t'的意思正是反斜杠,小写字母t。
发布于 2015-04-14 09:22:49
原因如下:
q{\\\t}是
"\\\\t" 这是三个字符,两个反斜杠,后面跟着't‘。
正则表达式#5匹配字符对的数组数(a \后面跟着另一个\或< tabulator >)
把这个改为
[q{\\\t}, qr/(\\[\\\t]*)*/], #not ok还是不太好,
但
[q{\\\t}, qr/(\\[\\t]*)*/], #ok会起作用的。
乔格
https://stackoverflow.com/questions/29623314
复制相似问题