我使用curl将网站存储为变量$ mystring。如何返回以“810”开头的每个8位数字?
我目前有:
#!/usr/local/bin/perl
my $curl = `curl ...`;
$curl =~ /(810\d+)/;
print "$1\n";
除此之外只返回第一个实例。我如何返回所有实例并将其存储在数组中?
答案 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
)或前后查看非数字。