我不能使用捕获组替换?

时间:2013-08-18 16:05:55

标签: regex perl

在下面的脚本中,我试图保留小数部分和前2个小数部分,如果它大于0则保留第三个小数部分。 所以应将12.37500000000392替换为12.375

#!/usr/bin/perl  

use strict;  
use warnings;  

my $price = 12.37500000000392;  
print "price = $price \n";  
$price =~ s/([0-9]+)(\.[1-9]{2}[1-9]?)\d*?/$1$2/;   

print "1 = $1 \n";  
print "2 = $2 \n";  
print "price = $price \n"; 

但它不起作用。
它显示$112$2.375,但最后12.37500000000392语句中的价格仍显示为print

2 个答案:

答案 0 :(得分:4)

问题在于最后的不合理重复。只需使用

$price =~ s/([0-9]+)(\.[1-9]{2}[1-9]?)\d*/$1$2/;

由于?使*匹配尽可能少重复 - 并且模式结尾处没有其他条件可以使其失败 - 重复\d 0次是最少的,所以剩下的数字根本就不匹配,因此不会被替换。

请注意,如果前两位数之一为零,则您的模式根本不匹配。你可能想用

$price =~ s/([0-9]+)(\.[0-9]{2}[1-9]?)\d*/$1$2/;

此外,如果您稍后不需要整数和小数部分,您可以稍微简化整个事情:

$price =~ s/([0-9]+\.[0-9]{2}[1-9]?)\d*/$1/;

答案 1 :(得分:1)

你可以用:

$price =~ s/\.\d{2}[1-9]?\K\d*//;