如何在Perl正则表达式中捕获一个点?

时间:2017-01-19 18:02:33

标签: regex perl pcre

我正在尝试执行以下代码行:

  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”。

2 个答案:

答案 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+位数。