gpt4 book ai didi

regex - Perl split 函数 - 使用重复字符作为分隔符

转载 作者:行者123 更新时间:2023-12-03 01:33:53 25 4
gpt4 key购买 nike

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

@s = split /([[:alpha:]])\1+/, '123aaaa23a3';

但这返回'123', 'a', '23a3',这不是我想要的。现在我知道这是因为 'aaaa' 中的最后一个 'a' 被括号捕获,因此被 split() 保留。但无论如何,我无法添加类似 ?: 的内容,因为必须捕获 [[:alpha:]] 以供反向引用。我该如何解决这种情况?

最佳答案

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

也许是这样的?:

my %s = (split (/([[:alpha:]])\1+/, '123aaaa23a3'), '' );
print Dumper \%s;

这会给你:

$VAR1 = {
'23a3' => '',
'123' => 'a'
};

因此您可以通过提取您的模式。

不幸的是,我通过 %+ '选择'模式匹配的第二种方法并没有特别帮助( split 不会填充正则表达式的内容)。

但是像这样:

my @delims ='123aaaa23a3' =~ m/(?<delim>[[:alpha:]])\g{delim}+/g; 
print Dumper \%+;

通过使用命名捕获,我们可以识别 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;

我们首先处理字符串以提取“2 个或更多”字符模式,以设置为我们的分隔符。然后我们使用非捕获方式将它们组装成一个正则表达式,这样我们就可以进行拆分。

关于regex - Perl split 函数 - 使用重复字符作为分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32686837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com