嗯,这是一个有趣的。我的第一个想法是 - 你的分隔符将始终是奇数,因此你可以丢弃任何奇数数组元素。
也许是这样的?:
my %s = (split (/([[:alpha:]])\1+/, '123aaaa23a3'), '' );
print Dumper \%s;
这会给你:
$VAR1 = {
'23a3' => '',
'123' => 'a'
};
所以你可以通过提取你的模式keys
.
不幸的是,我“选择”模式的第二种方法通过%+
没有特别帮助( split 不会填充正则表达式的内容)。
但像这样的事情:
my @delims ='123aaaa23a3' =~ m/(?<delim>[[:alpha:]])\g{delim}+/g;
print Dumper \%+;
通过使用命名捕获,我们确定a
来自捕获组。不幸的是,当您通过以下方式执行此操作时,这似乎并未填充split
- 这可能会导致两次通过的方法。
这是我得到的最接近的:
#!/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 个或更多”字符模式,以设置为我们的分隔符。然后我们使用非捕获方式将它们组装成一个正则表达式,这样我们就可以进行拆分。