“这些模式匹配变量是标量,因此,只能容纳一个值。该值是捕获的括号匹配的任何内容 最后的."
http://blogs.perl.org/users/sirhc/2012/05/repeated-capturing-and-and-parsing.html
在您的示例中, $1
火柴 1.2.3
. 。随着图案的重复, $2
将设置为 .2
直到最后一场比赛 .3
题
我正在使用小组尝试以某种模式进行匹配,并且没有得到我期望的结果。感兴趣的模式如下:
([0-9]+(\.[0-9]+)+)
对于字符串 1.23
, ,我明白了 $1=1.23
, , 和 $2=.23
这对我来说很有意义。
但是对于字符串 1.2.3
, ,我明白了 $1=1.2.3
和 $2=.3
, ,我期待的地方 $2=.2.3
, ,因为它的组是小数点和数字,重复。
有人可以向我解释这是如何工作的吗?谢谢!
解决方案 2
“这些模式匹配变量是标量,因此,只能容纳一个值。该值是捕获的括号匹配的任何内容 最后的."
http://blogs.perl.org/users/sirhc/2012/05/repeated-capturing-and-and-parsing.html
在您的示例中, $1
火柴 1.2.3
. 。随着图案的重复, $2
将设置为 .2
直到最后一场比赛 .3
其他提示
当您将捕获组与量词一起使用时,仅 最后的 将存储捕获图案的重复。
也许这条正人将满足您的需求:
\b(\d+)((?:\.\d+)+)\b
该正则是将领先的整数序列与其重复分数组件分开。
(如@ysth所示,请记住 \d
可能 匹配更多字符 比你打算。如果是这种情况,请使用字符类 [0-9]
而是使用 /a
修饰符.)
这是一个PERL程序,可以在示例数据集上演示此正则态度。 (另请参阅 现场演示.)
#!/usr/bin/perl -w
use strict;
use warnings;
while (<DATA>) {
chomp;
# A - A sequence of digits
# B - A period and a sequence of digits
# C - Repeat 'B'.
if (/\b(\d+)((?:\.\d+)+)\b/) {
# ^^^ ^^^^^
# A B
# ^^^^^^^
# C
print "[$1] [$2]\n";
}
}
__END__
1.23
123.456
1.2.3
1.22.333.444
预期输出:
[1] [.23]
[123] [.456]
[3] [.2.3]
[4] [.22.333.444]