正则匹配的问题

正则匹配的问题

$digits="1234567890";

@aa=$digits=~/(?=(\d\d\d))/g;

@aa 的结果是 123 234 345 456 567 678 789 890

没有明白这里面的匹配过程 ,希望有知道的能说说 为什么会是这个结果。
对于代码:

@aa=$digits=~/(?=(\d\d\d))/g;

,它尝试匹配的是任意三位连续的数字。但是由于是全局匹配,而且使用过的字符还可以重复使用,因此出现了这样的结果:

123 234 345 456 567 678 789 890


如果楼主是要每三位之间分开,不重复使用字符,可以使用这样的表达式:

@aa=$digits=~/(?>(\d\d\d))/g;

其结果将是:

123 456 789

这是因为,固化分组?>使得用过的字符不再参与下一次的匹配。
谢谢  不过我还是没有搞明白
@aa=$digits=~/(\d\d\d)/g;
出现的是 123 456 789
这个?=是什么模式  我试过用??=结果说错误
?=是什么 你后面说道?>又是什么
如果我要实现的是
123 345 567 789呢
如果想实现

123 345 567 789

可以使用下面的代码:

while($digits =~ s/(\d\d)(\d)/\2/)
{
    print $1.$2,"\n";
}
谢谢 zhasm
不过我更想要的是这个正则的思路,和你是怎么想的。而不仅仅是一个答案。
能说说 ?= ?> 这些都代表什么东西
?=这个玩意中文翻译叫做零宽度断言
作用是匹配的时候正则表达式引擎不向前移动
而如果全部正则表达式都是零宽度的,就像你给的例子,会出现保持在第一个位置不动而无限循环的情况,所以此时正则引擎会自动前移一个字符位置来避免这种情况。

其他的?扩展模式见perldoc perlre
谢谢 redicaps
有的明白你的意思了
perldoc perlre还真好用
呵呵,正则式果然博大精深。。。
学习了~
没用过这么有难度的~
你需要明白/g的作用,以及?=是干什么的
这样说吧,?=匹配的是一个位置
对于你的情况

[Copy to clipboard] [ - ]
CODE:
@aa=$digits=~/(?=(\d\d\d))/g;

正则引擎从字符串的第0个位置开始,匹配的是这样一个位置:后面是三个数字并且将结果捕获。
很显然第0个位置已经满足这个要求,所以匹配是满足的,返回结果123到@a中
这个时候你需要注意了,由于这个位置(位置0)可以匹配无限次,这个和一般的匹配,比如说\d \s是不一样的,这些匹配时消耗字符串的,而?=是不消耗字符串的,由于能够匹配无限多次(由于/g的作用),那势必引起死循环,所以这个时候正则引擎就会帮你跳出死循环,具体的表现就是它会帮你移动匹配的位置,从第0位置移动到第1个位置,依次类推,所以会出现你这样的情况。