perl如何解析字符串?

Posted

技术标签:

【中文标题】perl如何解析字符串?【英文标题】:How to parse a string in perl? 【发布时间】:2021-06-17 08:04:34 【问题描述】:

我有一个字符串,它是一个 IP 地址列表和一个重要的数字。

我正在尝试解析字符串,使其仅包含 IP 地址。或者更好的是,根据表示的 IP 地址数量创建多个字符串。

我觉得我很接近,但没有雪茄。

输入:

$str = "[11.22.33.44]-30,[55.66.77.88]-30"

预期输出:

11.22.33.44
55.66.77.88

我第一次使用正则表达式解决这个问题:

while ($tempBlackList =~ /(\w+)/g) 
    print "$1\n";

这会导致:

11
22
33
44
30
55
66
77
88
30

尝试解决此问题的第二次迭代:

while ($tempBlackList =~ /(\w+)(\w+)(\w+)(\w+)/g) 
    print "\"$1.$2.$3.$4\n";

这将导致不打印任何内容。我希望它是我想要的。

任何帮助将不胜感激。

【问题讨论】:

\w 不匹配 . 【参考方案1】:

/(\w+)(\w+)(\w+)(\w+)/g 模式匹配四个连续出现的 \w+ 模式,匹配一个或多个不包含点的单词字符(点不是单词字符)。

如果您在组之间插入\.,该方法将起作用:

while ($tempBlackList =~ /(\w+)\.(\w+)\.(\w+)\.(\w+)/g) 
    print "$1.$2.$3.$4\n";

但是,在这里你可以使用

my $tempBlackList = "[11.22.33.44]-30,[55.66.77.88]-30";
while ($tempBlackList =~ /\[([^][]+)]/g) 
    print "$1\n";

输出:

11.22.33.44
55.66.77.88

见this Perl demo。

然而,由于IP regex 是众所周知的模式,您可以使用它来提取所有出现的情况:

my $tempBlackList = "[11.22.33.44]-30,[55.66.77.88]-30";
while ($tempBlackList =~ /\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:\.(?2))3)\b/g) 
    print "$1\n";

见this Perl demo。

【讨论】:

以上是关于perl如何解析字符串?的主要内容,如果未能解决你的问题,请参考以下文章

在 Perl 中使用 awk 解析两个字符串之间的所有内容

Perl双引号和单引号的区别

Perl:使用正则表达式将十六进制编码的字符串解析为数组

在 Perl 中使用正则表达式解析属性

使用 Regex / Perl 解析日期列

Perl 中 unpack 结合 join 的性能