我正在尝试执行以下代码行:
my $test = 'test .15oz test';
$test =~ /([\d]+)([\.]?[\d]+)*oz\b/;
print("test=$1\n");
这个输出是:
test=15
我想抓住那个点。我究竟做错了什么? 最好的方法是以某种方式捕获 0.15 ,但是现在我甚至无法得到一个点。
任何从regex
获得0.15的帮助都将不胜感激,所以:
0.15 - > 0.15
.15 - > 0.15
.. 15 - > 0.15
0.0.0.15 - > 0.15
000.15 - > 0.15
15 - > 15
我也试过了:
$test =~ /([\d]+)(\.?[\d]+)*oz\b/;
$test =~ /([\d]+)([.]?[\d]+)*oz\b/;
但没有成功。仍然得到“15”。
答案 0 :(得分:4)
您要匹配的字符串由
匹配(?:\d+(?:\.\d+)?|\.\d+)oz
(WiktorStribiżew发布的内容更短,但效率更低。)
所以你想要
if ( my ($match) = $test =~ /(\d+(?:\.\d+)?|\.\d+)oz/ ) {
say $match;
}
如果您输入0.15
或.15
,则无法与..15
匹配。只需修改字符串就可以独立匹配。
$match = "0".$match if $match =~ /^\./;
同样,修剪前导零最好在匹配之外完成。
$match =~ s/^0+(?!\.)//;
总之,我们得到了
if ( my ($match) = $test =~ /(\d+(?:\.\d+)?|\.\d+)oz/ ) {
$match =~ s/^0+(?!\.)//;
$match = "0".$match if $match =~ /^\./;
say $match;
}
答案 1 :(得分:1)
您正在使用第一个捕获组。在您的模式([\d]+)([\.]?[\d]+)*oz\b
中,第一个捕获组匹配一个或多个数字。要在oz
之前捕获整个浮点数或整数,请使用
$test =~ /(\d*\.?\d+)oz\b/;
^ ^
其中\d*\.?\d+
将匹配0+位数,一个可选点(注意它在字符类之外转义)和1+位数。