Perl正则表达式{}量化多个匹配

时间:2013-09-12 14:54:30

标签: regex perl

我试图解析一个文件,其中每行有3个浮点数(1,+ 1.0~1.0是有效值),而片段中的正则表达式与浮点值匹配,我不知道我应该如何使用Perl量词{n}匹配单行内的多个浮点数。

#!/usr/bin/perl
use strict;
use warnings;

open(my $fh, "<", "floatNumbers.txt") or die "Cannot open < floatNumbers.txt";

while(<$fh>)
{
  if ($_=~m/([-+]?\d*[\.[0-9]*]?\s*)/)
  {
    print $1."\n";
  }
}

代码段,我试图匹配一行中的3个浮点数。读者可以帮助我正确使用{}量词吗?

  if ($_=~m/([-+]?\d*[\.[0-9]*]?\s*){3}/)

3 个答案:

答案 0 :(得分:3)

您正在尝试同时进行提取和验证。我会选择:

sub is_float {
   return $_[0] =~ /
      ^
      [-+]?
      (?: \d+(?:\.[0-9]*)?  # 9, 9., 9.9
      |         \.[0-9]+    # .9
      )
      \z
   /x;
}

while (<$fh>) {
   my @fields = split;

   if (@fields != 3 || grep { !is_float($_) } @fields) {
      warn("Syntax error at line $.\n");
      next;
   }

   print("@fields\n");
}

请注意,您的验证已将.[...0...0...视为数字。我解决了这个问题。

答案 1 :(得分:1)

Quntifiers只允许您指定要在正则表达式中匹配内容的次数。

例如,/(ba){3}/将匹配字符串中的ba完全 3次:

bababanfnfd = bababa但不是

baba =不匹配。

您也可以使用(取自:http://perldoc.perl.org/perlrequick.html):

  • 一个? =匹配&#39; a&#39; 1或0次
  • a * =匹配&#39; a&#39; 0次或更多次,即任意次数
  • a + =匹配&#39; a&#39; 1次或多次,即至少一次
  • a {n,m} =匹配至少n次,但不超过m次。
  • a {n,} =匹配至少n次或更多次
  • a {n} =完全匹配n次

答案 2 :(得分:1)

这是一种广义模式,我认为你正在谈论的是:

 #  ^\s*(?:[-+]?(?=[^\s\d]*\d)\d*\.?\d*(?:\s+|$)){3}$

 ^                         # BOL
 \s*                       # optional whitespaces
 (?:                       # Grouping start
      [-+]?                     # optional -+
      (?= [^\s\d]* \d )         # lookahead for \d
      \d* \.? \d*               # match this form (everything optional but guaranteed a \d)
      (?: \s+ | $ )             # whitespaces or EOL
 ){3}                      # Grouping end, do 3 times
 $                         # EOL