解释下面的代码:
$x = '12aba34ba5';
@num = split /(a|b)+/, $x;
gives # @num = ('12','a','34','a','5')
@num = split /(?:a|b)+/, $x;
gives # @num = ('12','34','5')
答案 0 :(得分:1)
在第一种情况下,您正在捕获(a|b)
,因此a
会被捕获。(a|b)+
将匹配aba
但仅a
将被存储为正则结构仅记住当连续组在那里时最后一个。所以在任何顺序中分组都是ab
组。在第二种情况下,你不能捕获(a|b)
。所以你得到正确的分割结果。
答案 1 :(得分:0)
字符串12aba34ba5
在多个a
或b
字符出现时被拆分,结果为12
,34
,5
但是,在分割正则表达式中还有一个捕获,它将捕获的字符串插入split
列表
如果你写'aba' =~ /(a|b)+/
,那么模式(a|b)
会出现三次,但只有 last 可以保存在$1
中,这是split
插入的值
因此,您将获取aba
(a
)的最后一个值以及ba
的另一个值(另一个a
)并将其插入列表中, 12
,a
,34
,a
,5
如果你想将这些字母与数字分开,你可以写
@num = split /((?:a|b)+)/, $x;
或等同且更整洁
@num = split /([ab]+)/, $x;
提供12
,aba
,34
,ba
,5