加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 06:22:55 所属栏目:百科 来源:网络整理
导读:我想用重复字母作为分隔符来分割字符串,例如, “123aaaa23a3”应分为(‘123′,’23a3’),而“123abc4”应保持不变. 所以我尝试了这个: @s = split /([[:alpha:]])1+/,'123aaaa23a3'; 但这会返回’123′,’a’,’23a3′,这不是我想要的.现在我知道这是因为
我想用重复字母作为分隔符来分割字符串,例如,
“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: $regexn";

#split on the regex
my @s  = split m/$regex/,$str;

print Dumper @s;

我们首先处理字符串以提取“2或更多”字符模式,以设置为我们的delmiters.然后我们使用非捕获来组装正则表达式,因此我们可以拆分.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读