Perl拆分功能 - 使用重复字符作为分隔符

Aar*_*onS 7 regex perl

我想用重复的字母作为分隔符,例如,分割字符串 "123aaaa23a3"应该被分割('123', '23a3'),而"123abc4"应保持不变.
所以我尝试了这个:

@s = split /([[:alpha:]])\1+/, '123aaaa23a3';
Run Code Online (Sandbox Code Playgroud)

但这会回来'123', 'a', '23a3',这不是我想要的.现在我知道,这是因为最后'a''aaaa'由括号捕获并因此被保留下来split().但无论如何,我无法添加类似的东西,?:因为[[:alpha:]]必须捕获以供后面参考.我该如何解决这种情况?

Sob*_*que 4

嗯,这是一个有趣的。我的第一个想法是 - 你的分隔符将始终是奇数,因此你可以丢弃任何奇数数组元素。

也许是这样的?:

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 个或更多”字符模式,以设置为我们的分隔符。然后我们使用非捕获方式将它们组装成一个正则表达式,这样我们就可以进行拆分。