1

我试图解析一个文件,其中每行有 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}/)
4

3 回答 3

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...是数字。我修好了。

于 2013-09-12T15:06:25.800 回答
2

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

例如/(ba){3}/ba在字符串中精确匹配3 次:

bababanfnfd =bababa但不是

巴巴 = 不匹配。

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

  • 一种?= 匹配 'a' 1 或 0 次
  • a* = 匹配 'a' 0 次或更多次,即任意次数
  • a+ = 匹配 'a' 1 次或多次,即至少一次
  • a{n,m} = 匹配至少 n 次,但不超过 m 次。
  • a{n,} = 匹配至少 n 次或更多次
  • a{n} = 精确匹配 n 次
于 2013-09-12T14:56:54.797 回答
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
于 2013-09-12T15:50:26.987 回答