Regex perl:如何拆分?

Regex perl:如何拆分?,regex,perl,split,substr,Regex,Perl,Split,Substr,我有一个字符串aa:bb::cc:yy:zz,它需要以这样的方式拆分,以便我有一个数组,其中包含aa:bb::cc,yy,zz。i、 e.我想从最后一个创建两个子字符串,其中:作为分隔符,其余作为数组的元素。实现这一目标的最佳方式是什么 例: 我将IP地址:端口:协议作为密钥存储在一个文件中,并将其拆分为“:”以获取IP、端口、协议,当IP地址限制为Ipv4时,一切正常。现在我想将其移植到Ipv6,在这种情况下,IP地址包含“:”所以我无法通过拆分“:”来获得正确的IP地址 更新:您没有提到这是

我有一个字符串
aa:bb::cc:yy:zz
,它需要以这样的方式拆分,以便我有一个数组,其中包含
aa:bb::cc
yy
zz
。i、 e.我想从最后一个创建两个子字符串,其中
作为分隔符,其余作为数组的元素。实现这一目标的最佳方式是什么

例:

我将IP地址:端口:协议作为密钥存储在一个文件中,并将其拆分为“:”以获取IP、端口、协议,当IP地址限制为Ipv4时,一切正常。现在我想将其移植到Ipv6,在这种情况下,IP地址包含“:”所以我无法通过拆分“:”来获得正确的IP地址

更新:您没有提到这是为了解析IP地址。如果是,您最好尝试在

上查找一个模块,如何:

#!/usr/local/bin/perl 
use Data::Dump qw(dump);
use strict;
use warnings;

my $x = 'dd:ff:gg:dd:ee:ff:fg';
my @l = $x =~ /^(.*?):([^:]+):([^:]+)$/g;
dump @l;
输出:

("dd:ff:gg:dd:ee", "ff", "fg")

我会做一个过度的攻击,然后加入。我认为,如果不使用复杂的正则表达式进行拆分,那么结果更具可读性。因此:

my $string = 'aa:bb::cc:yy:zz';
my @split_string = split(/:/, $string);
my @result = (join(':', @split_string[0..scalar(@split_string)-3]), $split_string[-2], $split_string[-1]);
print join(', ', @result), "\n";
给你:

aa:bb::cc, yy, zz

在开始这样索引之前,您必须对
@split\u string
执行一些数组边界检查。

此代码将纠正$string包含2对或更少对的情况:

my $string = 'aa:bb::cc:yy:zz';
my @data = split /:/, $string;
if (@data > 2) {
    unshift @data, join ':', splice @data, 0, -2;
}

# $string = 'aa:bb::cc:yy:zz';
# @data contains ('aa:bb::cc', 'yy', 'zz')

# $string = 'aa:bb';
# @data contains ('aa', 'bb')

请注意,这将在“两对或更少对”字符串上失败,如“dd:ff”或“dd”,这对我来说不是问题,因为我希望最少有3个参数。谢谢M42,这是我的完美解决方案。@kumar欢迎您。它与M42的解决方案基本相同。使用标准化的
[IP address]:port
格式存储
(IP,端口)
对会更安全。模块中的
parse_hostport
/
format_hostport
有助于处理它。
my $string = 'aa:bb::cc:yy:zz';
my @split_string = split(/:/, $string);
my @result = (join(':', @split_string[0..scalar(@split_string)-3]), $split_string[-2], $split_string[-1]);
print join(', ', @result), "\n";
aa:bb::cc, yy, zz
my $string = 'aa:bb::cc:yy:zz';
my @data = split /:/, $string;
if (@data > 2) {
    unshift @data, join ':', splice @data, 0, -2;
}

# $string = 'aa:bb::cc:yy:zz';
# @data contains ('aa:bb::cc', 'yy', 'zz')

# $string = 'aa:bb';
# @data contains ('aa', 'bb')