解释以下代码处理perl中的正则表达式

时间:2015-05-13 08:57:18

标签: regex perl

解释下面的代码:

$x = '12aba34ba5';

@num = split /(a|b)+/, $x;   
gives   # @num = ('12','a','34','a','5')

@num = split /(?:a|b)+/, $x;
gives # @num = ('12','34','5')

2 个答案:

答案 0 :(得分:1)

在第一种情况下,您正在捕获(a|b),因此a会被捕获。(a|b)+将匹配aba但仅a将被存储为正则结构仅记住当连续组在那里时最后一个。所以在任何顺序中分组都是ab组。在第二种情况下,你不能捕获(a|b)。所以你得到正确的分割结果。

答案 1 :(得分:0)

字符串12aba34ba5在多个ab字符出现时被拆分,结果为12345

但是,在分割正则表达式中还有一个捕获,它将捕获的字符串插入split列表

如果你写'aba' =~ /(a|b)+/,那么模式(a|b)会出现三次,但只有 last 可以保存在$1中,这是split插入的值

因此,您将获取abaa)的最后一个值以及ba的另一个值(另一个a)并将其插入列表中, 12a34a5

如果你想将这些字母与数字分开,你可以写

@num = split /((?:a|b)+)/, $x;

或等同且更整洁

@num = split /([ab]+)/, $x;

提供12aba34ba5