我想用重复字母作为分隔符来分割字符串,例如,
“123aaaa23a3”应分为(‘123′,’23a3’),而“123abc4”应保持不变.
所以我尝试了这个:
“123aaaa23a3”应分为(‘123′,’23a3’),而“123abc4”应保持不变.
所以我尝试了这个:
@s = split /([[:alpha:]])\1+/,'123aaaa23a3';
但这会返回’123′,’a’,’23a3′,这不是我想要的.现在我知道这是因为’aaaa’中的最后一个’a’被parantheses捕获并因此被split()保留.但无论如何,我不能添加类似的东西?:因为[[:alpha:]]必须被捕获以供反向引用.
我该如何解决这种情况?
嗯,这是一个有趣的.我的第一个想法是 – 你的分隔符总是奇数,所以你可以丢弃任何奇数编号的数组元素.
也许是这样的事情?:
my %s = (split (/([[:alpha:]])\1+/,'123aaaa23a3'),'' ); print Dumper \%s;
这会给你:
$VAR1 = { '23a3' => '','123' => 'a' };
所以你可以通过键提取你的模式.
不幸的是,我第二种“选择”模式匹配通过%的方法没有特别的帮助(拆分不填充正则表达式的东西).
但是这样的事情:
my @delims ='123aaaa23a3' =~ m/(?<delim>[[:alpha:]])\g{delim}+/g; print Dumper \%+;
通过使用命名捕获,我们确定a来自捕获组.不幸的是,当您通过拆分执行此操作时似乎没有填充 – 这可能会导致双通道方法.
这是我得到的最接近的:
#!/usr/bin/env perl use strict; use warnings; use Data::Dumper; my $str = '123aaaa23a3'; #build a regex out of '2-or-more' characters. my $regex = join ( "|",map { $_."{2,}"} $str =~ m/([[:alpha:]])\1+/g); #make the regex non-capturing $regex = qr/(?:$regex)/; print "Using: $regex\n"; #split on the regex my @s = split m/$regex/,$str; print Dumper \@s;
我们首先处理字符串以提取“2或更多”字符模式,以设置为我们的delmiters.然后我们使用非捕获来组装正则表达式,因此我们可以拆分.