正则表达式 – 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.然后我们使用非捕获来组装正则表达式,因此我们可以拆分. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |