Perl regex-为什么regex/[0-9\.]+;(\,)/匹配逗号

Perl regex-为什么regex/[0-9\.]+;(\,)/匹配逗号,regex,perl,Regex,Perl,以下内容似乎与, 有人能解释一下原因吗 我想匹配多个以逗号结尾的数字或点 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, # , 更新: 逗号匹配是因为: 在列表上下文中,//

以下内容似乎与
有人能解释一下原因吗


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

 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,
#        ,
更新:
逗号匹配是因为:
在列表上下文中,//g返回匹配分组的列表,如果没有分组,则返回整个正则表达式的匹配列表

根据定义,foreach循环中的匹配项位于列表上下文中。在列表上下文中,匹配返回其捕获的内容。paren表示捕获,而不是整个正则表达式。逗号周围有个括号。如果你想换一种方式,把帕伦放在你想要的地方

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

如果不想匹配逗号,请使用先行断言:

/[0-9\.]+(?=,)/g
使用从匹配本身中排除逗号:

$text=~/[0-9\.]+(?=,)/g

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

以下是检索捕获组的方式:

$mystring = "The start text always precedes the end of the end text.";
if($mystring =~ m/start(.*)end/) {
    print $1;
}

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

$text =~ /([0-9\.]+),/g

你不需要避开逗号;如果你不想抓住他们,你就不要帕伦夫妇。你到底想打印什么/caputre?不确定这里的问题是什么。您的捕获组包含一个转义的逗号(不确定反斜杠对Perl中的逗号有任何影响),因此我希望它返回一个逗号作为捕获的字符串。请编辑您的问题以完成您的想法-“如何匹配长度超过的一组数,哪个”?我想匹配多个数字/点,后跟逗号。不清楚perl regexp是否只返回matchpart,它由
()
括起来。我使用它们对regexp的部分进行分组。为此,括号中存在不匹配项: