2

以下似乎匹配, 有人可以解释为什么吗?

我想匹配多个以逗号结尾的数字或点。

 123.456.768,
 123,
 .,
 1.2,

但是执行以下操作,也会意外打印

my $text = "241.000,00";
foreach my $match ($text =~ /[0-9\.]+(\,)/g){
    print "$match \n";
}
print $text; 

# prints 241.000,
#        ,

更新:
逗号匹配,因为: In list context, //g returns a list of matched groupings, or if there are no groupings, a list of matches to the whole regex 如此处定义

4

5 回答 5

4

您在 foreach 循环中的匹配项在列表上下文中。在列表上下文中,匹配返回其捕获的内容。Parens 表示捕获,而不是整个正则表达式。你在逗号周围有括号。你想要它反过来,把括号放在你想要的位置。

my $text = "241.000,00";

# my($foo) puts the right hand side in list context.
my($integer_part) = $text =~ /([0-9\.]+),/;

print "$integer_part\n";  # 241.000
于 2012-11-21T21:35:16.477 回答
4

使用零宽度正向预测断言从匹配本身中排除逗号:

$text =~ /[0-9\.]+(?=,)/g
于 2012-11-21T21:36:04.963 回答
3

如果您不想匹配逗号,请使用前瞻断言:

/[0-9\.]+(?=,)/g
于 2012-11-21T21:35:26.430 回答
2

你抓错东西了!将括号从逗号周围移动到数字周围。

$text =~ /([0-9\.]+),/g
于 2012-11-21T22:20:14.580 回答
1

您可以用前瞻替换逗号,或者完全排除逗号,因为它不是您要捕获的内容的一部分,在这种情况下不会有任何区别。但是,该模式将逗号而不是数字放入捕获组 1,然后甚至不被捕获组引用,而是返回整个匹配项。

这是检索捕获组的方式:

$mystring = "The start text always precedes the end of the end text.";
if($mystring =~ m/start(.*)end/) {
    print $1;
}
于 2012-11-21T21:49:14.613 回答