Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何从Perl字符串中提取不同数量的数字组?_Regex_Perl_Multiple Matches - Fatal编程技术网

Regex 如何从Perl字符串中提取不同数量的数字组?

Regex 如何从Perl字符串中提取不同数量的数字组?,regex,perl,multiple-matches,Regex,Perl,Multiple Matches,我试图用Perl解析一个字符串,格式如下: 推送到订单簿队列12369121574 146343 103046 161253的消息 我想访问字符串末尾的数字,因此打算进行如下匹配 /(\d+)/s 我的问题是,末尾的值数量包含数量可变的字符串 格式化regexp以便能够单独访问这些数字的最佳方法是什么?我是C++开发者,我只是学习Perl,所以我在寻找最干净的Perl方式来完成这个任务。 谢谢你的帮助。我会这样做: my @numbers; if (m/Messages pushed to th

我试图用Perl解析一个字符串,格式如下:

推送到订单簿队列12369121574 146343 103046 161253的消息

我想访问字符串末尾的数字,因此打算进行如下匹配

/(\d+)/s

我的问题是,末尾的值数量包含数量可变的字符串

格式化regexp以便能够单独访问这些数字的最佳方法是什么?我是C++开发者,我只是学习Perl,所以我在寻找最干净的Perl方式来完成这个任务。
谢谢你的帮助。

我会这样做:

my @numbers;
if (m/Messages pushed to the Order Book queues ([\d\s]+)/) {
   @numbers = split(/\s+/, $1);
}
无需将其填充到一个正则表达式中。

“在标量上下文中,每次执行m//g都会找到下一个匹配项,如果匹配则返回true,如果没有进一步的匹配则返回false。”(来自
perldoc perlop

因此,您应该能够创建一个全局正则表达式循环,如下所示:

while ($string =~ /(\d+)/g) {
    push @queuelist, $1;
}

只需使用/g标志使匹配操作符执行全局匹配。在列表上下文中,匹配运算符将所有结果作为列表返回:

@result = $string =~ /(\d+)/g;

如果除尾随数字外没有其他数字,则此操作有效。

您可以在带有全局标志的列表上下文中使用匹配运算符来获取所有附加捕获的列表。例如:

@list = ($string =~ /(\d+)/g);
您的列表现在应该包含字符串中的所有数字组。
有关详细信息,请参阅上的文档。

有许多更优雅的方法,请参阅其他答案。\d与Perl 5.8和5.10中的[0-9]不匹配;它匹配任何具有数字属性的UNICODE字符(包括“\x{1815}”,蒙古语数字5)。如果您的意思是[0-9],则必须使用[0-9]或字节pragma(但它将所有字符串转换为1字节字符,通常不是您想要的)。