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