来自Mastering Regular Expressions的Perl替换示例书不适用于我

时间:2017-12-14 17:29:58

标签: regex perl

我可能只是遗漏了一些简单的东西但是s///没有将更改的字符串分配给我的变量。我尝试了一个更简单的s///,它确实有效。

如果超过三个,则此示例应修剪小数点后的任何数字。

my $price = 12.34567;
print "$price\n";
$price =~ s/(\.\d\d[1-9]?)d*/$1/;
print "$1\n";           # This is printing .345 correctly.
print "$price\n";       # This should be 12.345 but is unchanged.

my $story = "dog";
$story =~ s/(do)g/$1/;
print "$story\n"; # This works.  It's changed to "do"

编辑:如果第三个数字为零,则应在两位数后修剪它。

“对股票价格进行整理: ...始终取小数点后的前两位数,并且只有在不为零时才取第三位数。然后,删除任何其他数字。

2 个答案:

答案 0 :(得分:1)

你的替换是错误的。

$price =~ s/(\.\d\d[1-9]?)d*/$1/;

应该是

$price =~ s/(\.\d\d[1-9]?)\d*/$1/;

您自己的版本匹配,因为d*可以匹配空字符串,因为在第三个小数位后面没有d个字符

坚持任何第三个十进制数字必须为非零似乎很奇怪。所以0.00很好,但0.000不是,并且将被截断为前者。那是你的意图吗?

答案 1 :(得分:0)

实际上,你在最后一个“d”之前只错过了一个反斜杠。

将第一个替换指令更改为:

$price =~ s/(\.\d\d[1-9]?)\d*/$1/;