1

各行に3つのfloat(1、+1.0 -1.0が有効な値)があるファイルを解析しようとしていますが、スニペットの正規表現はfloat値と一致しますが、Perl量指定子をどのように使用すればよいかわかりません{ n} を使用して、1 行内の複数のフロートに一致させます。

#!/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

量指定子を使用すると、正規表現で何回一致させたいかを指定できます。

たとえば、文字列内で正確に3 回/(ba){3}/一致します。ba

bababanfnfd =bababaしかしそうではない

ババ = 一致しません。

以下も使用できます (以下から取得: http://perldoc.perl.org/perlrequick.html ):

  • ?= 'a' に 1 回または 0 回一致
  • a* = 'a' に 0 回以上一致 (つまり、任意の回数)
  • a+ = 'a' に 1 回以上、つまり少なくとも 1 回一致
  • a{n,m} = 少なくとも n 回一致しますが、m 回を超えることはありません。
  • a{n,} = 少なくとも n 回以上一致
  • a{n} = 正確に n 回一致
于 2013-09-12T14:56:54.797 に答える