Jim*_*Jim 4 regex perl capture-group
在下面为什么条件要评估false?
$_ = "aa11bb";
if(/(.)\111/){
print "It matched!\n";
}
Run Code Online (Sandbox Code Playgroud)
是否\11或\111有特殊含义,因此Perl不能"看" \1?
实际上Perl正在解释 \111为八进制,这在你的字符串中找不到.如果找到这样的组数,它将仅考虑两个或更多个数字反向引用.为避免歧义,请使用\g或\g{}.引用文档(perlre - Capture Groups):
在Perl 5.10.0中引入了\ g和\ k符号.在此之前,没有命名或相对编号的捕获组.使用\ 1,\ 2等引用绝对编号的组,并且仍然接受该符号(并且可能总是如此).但是如果有超过9个捕获组,则会导致一些歧义,因为\ 10可能意味着第十个捕获组,或者八进制的序数为010(ASCII中的退格)的字符.Perl通过将\ 10解释为反向引用来解决这种歧义,只要在它之前至少打开了10个左括号.同样\ 11只有在前面至少有11个左括号打开后才是反向引用.等等.\ 1到\ 9始终被解释为反向引用.以下几个例子说明了这些危险.你可以通过总是使用\ g {}或\ g来避免歧义,如果你的意思是捕获组; 对于八进制常量,总是使用\ o {},或者对于\ 077及以下,使用用前导零填充的3位数,因为前导零表示八进制常量.
它的治疗\111作为一个单一的项目,因为没有什么分离\1从11.如果使用/x修改器允许间距,则可以消除歧义:
if(/(.)\1 11/x) { ...
Run Code Online (Sandbox Code Playgroud)