Perl:返回正则表达式的所有实例

时间:2014-10-10 22:55:38

标签: regex perl

我使用curl将网站存储为变量$ mystring。如何返回以“810”开头的每个8位数字?

我目前有:

#!/usr/local/bin/perl
my $curl = `curl ...`;
$curl =~ /(810\d+)/;
print "$1\n";

除此之外只返回第一个实例。我如何返回所有实例并将其存储在数组中?

3 个答案:

答案 0 :(得分:1)

使用/g Modifier

注意,如果您不是正则表达式专家,一个可能的解决方案是提取所有数字,然后筛选出您不想要的数字:

#!/usr/bin/env perl
use strict;
use warnings;

my $curl = do {local $/; <DATA>};

my @nums = grep {length == 8 && /^810/} $curl =~ /\d+/g;

print $_, "\n" for @nums;

__DATA__
Hello world
1                               # Too_short
134                             # Too_short
123456789                       # Too_long
81012345 810123456 81011111     # Pass    Too_long     Pass
81098765 81098765 181098765     # Pass    Test_repeat  Too_long_with_substring

输出:

81012345
81011111
81098765
81098765

然而,当然可以在一个正则表达式中完成同样的事情:

my @nums = $curl =~ /(?<!\d)(810\d{5})(?!\d)/g;

答案 1 :(得分:0)

您需要使用全局修饰符/g来捕获所有匹配项。

要搜索以810开头的8位数字,请使用\b匹配字边界,并指定要使用大括号搜索的位数; \d{5}匹配5位数。

要将匹配项存储在数组中,您可以执行以下操作:

my @numbers = ($curl =~ /\b810\d{5}\b/g);

答案 2 :(得分:0)

/g循环中使用while修饰符:

my @numbers;
while ($curl =~ /(810\d{5})/g) {
    push @numbers, $1;
}
print "@numbers\n";

要查找8位数字,请在前缀后搜索5位数字。此外,如果您不想匹配较大数字的部分内容,请检查字边界(\b)或前后查看非数字。