我想用重复的字母作为分隔符,例如,分割字符串
"123aaaa23a3"应该被分割('123', '23a3'),而"123abc4"应保持不变.
所以我尝试了这个:
@s = split /([[:alpha:]])\1+/, '123aaaa23a3';
Run Code Online (Sandbox Code Playgroud)
但这会回来'123', 'a', '23a3',这不是我想要的.现在我知道,这是因为最后'a'在'aaaa'由括号捕获并因此被保留下来split().但无论如何,我无法添加类似的东西,?:因为[[:alpha:]]必须捕获以供后面参考.我该如何解决这种情况?
嗯,这是一个有趣的。我的第一个想法是 - 你的分隔符将始终是奇数,因此你可以丢弃任何奇数数组元素。
也许是这样的?:
my %s = (split (/([[:alpha:]])\1+/, '123aaaa23a3'), '' );
print Dumper \%s;
Run Code Online (Sandbox Code Playgroud)
这会给你:
$VAR1 = {
'23a3' => '',
'123' => 'a'
};
Run Code Online (Sandbox Code Playgroud)
所以你可以通过提取你的模式keys。
不幸的是,我的第二种“选择”模式匹配的方法%+并没有特别帮助(分割不会填充正则表达式的内容)。
但像这样的事情:
my @delims ='123aaaa23a3' =~ m/(?<delim>[[:alpha:]])\g{delim}+/g;
print Dumper \%+;
Run Code Online (Sandbox Code Playgroud)
通过使用命名捕获,我们可以识别该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;
Run Code Online (Sandbox Code Playgroud)
我们首先处理字符串以提取“2 个或更多”字符模式,以设置为我们的分隔符。然后我们使用非捕获方式将它们组装成一个正则表达式,这样我们就可以进行拆分。