正则表达式 – Perl分割函数 – 使用重复字符作为分隔符

前端之家收集整理的这篇文章主要介绍了正则表达式 – Perl分割函数 – 使用重复字符作为分隔符前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想用重复字母作为分隔符来分割字符串,例如,
“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.然后我们使用非捕获来组装正则表达式,因此我们可以拆分.

猜你在找的正则表达式相关文章