假设我想匹配并捕获由一个或多个空格分隔的5个整数 - 示例输入:
1111 234 3333 456 7890
我可以这样做:
my $input = '1111 234 3333 456 7890';
if($input =~ /^\s*([0-9]+)\s+([0-9]+)\s+([0-9]+)\s+([0-9]+)\s+([0-9]+)/)
{
#$1 = '1111', $2 = '234', $3 = '3333', $4= '456', $5 = '7890'
}
但是我想做这样的事情来保持正则表达式更简单,而不是明确地重复每个int 5次:
my $input = '1111 234 3333 456 7890';
if($input =~ /^((\s*[0-9]+){5})/)
{
#$1 = '1111 234 3333 456 7890';
#$2 = ' 7890'
#all other capture variables are undefined
}
然而,捕获似乎没有成功。
我有什么方法可以做到这一点并且仍能访问我的5次捕获?
更好的是捕获数量未知:
my $input = '1111 234 3333 456 7890';
if($input =~ /^((\s*[0-9]+)+)/)
{
#foreach capture 1..N do something...
}
答案 0 :(得分:4)
my @numbers = $input =~ /\d+/g;
全局标志将返回列表上下文中的所有匹配项,这些匹配项将存储在您的数组中。
答案 1 :(得分:0)
如果您知道分隔符是什么(在这种情况下,是一个或多个空格),那么您不需要正则表达式来捕获您想要的内容。您可以使用split
。
use strict;
use warnings;
my $input = "1111 234 3333 456 7890";
my @ints=split /\s+/,$input;
print "$_\n" foreach(@ints);
产生输出:
1111
234
3333
456
7890
答案 2 :(得分:0)
该行的模式是否总是由空格分隔的数字组?如果是这样,为什么不拆分成基于空格的数组
,而不是正则表达式@outArray = split (/ +/,$input);
答案 3 :(得分:-1)
以下将捕获前5个整数并忽略之后的任何内容,如果那就是你所追求的。我可能不完全清楚。
#!/usr/bin/perl
use strict;
use warnings;
my $in = '1111 234 3333 456 7890 12 13';
my @ints = (split ' ', $in)[0 .. 4];
print "@ints\n";
打印:
1111 234 3333 456 7890
克里斯