我正在尝试匹配反斜杠后跟一个转义字符,如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会失败。我认为这将是正确的正则表达式使用..我在这里错过了什么?
答案 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 乔治