正则匹配的问题

具体的你可以通过下面这个脚本来看匹配过程

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
use warnings;
my $digit = "12345678";
my @aa = $digit =~ /(?{print "Staring match at $`|$'\n"})(?=(\d\d\d))/g

结果是

QUOTE:
Staring match at |12345678
Staring match at |12345678
Staring match at 1|2345678
Staring match at 1|2345678
Staring match at 12|345678
Staring match at 12|345678
Staring match at 123|45678
Staring match at 123|45678
Staring match at 1234|5678
Staring match at 1234|5678
Staring match at 12345|678
Staring match at 12345|678
Staring match at 123456|78
Staring match at 1234567|8
Staring match at 12345678

注意有些行的结果是一样的,这是因为上面所说的?=是不消耗字符串的,如果正则引擎没有帮忙(术语叫regex tranmission bump along),那么同样的行会出现无限次,这就是死循环,我个人的理解是这样的,正则引擎看到两次匹配的起始位置都是同一个并且匹配的都是同一个结果时,它就认为程序已经在死循环了,所以会帮你bump along.

类似的还有

[Copy to clipboard] [ - ]
CODE:
?=
?!
?<=
?<!

其中后面两个的表达式不能包含*,+等不定数量描述符
前面两个没有这样的限制
学习下perl的lookaround用法,即”环视“用法!看半个钟头书一切就明白了...