匹配浮点数> = 100

时间:2014-08-18 19:39:57

标签: regex perl floating-point pattern-matching string-matching

我逐行读取文件并想要以任何内容开头,而不是AB和包含(至少)三位数浮点数后跟一个百分号(即任何浮点数%%大于或等于100%)。

例如:

AA whatevs 102.342% dontcare #MATCH
AB whatevs 102.342% dontcare #MISMATCH
AC whatevs 12.3042% dontcare #MISMATCH *
AD whatevs 102% dontcare #MATCH *
AE whatevs 2002.3042% dontcare #MATCH
AF whatevs 22.3021% dontcare #MISMATCH
AG whatevs 102.342 12.342% dontcare #MISMATCH **

到目前为止,我有以下正则表达式解决方案,它显然没有捕获AD whatevs 102% dontcare

/^(?!AB).*\d{3}\.\d*%/

/^(?!AB).*\d{3}\.?\d*%/也不起作用,因为它与AF whatevs 22.3021% dontcare匹配。

我知道我可以根据.的存在将我的正则表达式分成两个子正则表达式。但是,我想看看是否有一个正则表达式解决方案。

2 个答案:

答案 0 :(得分:5)

正如您所注意到的,有很多不同的方法来表示浮点数。您可以使用Regexp::Common::number来处理它们,而不是滚动自己的正则表达式:

use strict;
use warnings;

use Regexp::Common qw(number);

while (<DATA>) {
    next if /^AB/;

    print if /\b$RE{num}{real}{-keep}%/ and $1 >= 100;
}

__DATA__
AA whatevs 102.342% dontcare #MATCH
AB whatevs 102.342% dontcare #MISMATCH
AC whatevs 12.3042% dontcare #MISMATCH *
AD whatevs 102% dontcare #MATCH *
AE whatevs 2002.3042% dontcare #MATCH
AF whatevs 22.3021% dontcare #MISMATCH
AG whatevs 102.342 12.342% dontcare #MISMATCH **
AH whatevs 1.02342E02% dontcare #MATCH
AI whatevs -102% dontcare #MISMATCH

输出:

AA whatevs 102.342% dontcare #MATCH
AD whatevs 102% dontcare #MATCH *
AE whatevs 2002.3042% dontcare #MATCH
AH whatevs 1.02342E02% dontcare #MATCH

我在数据集中添加了一个负数和一个指数,以证明使用Regexp::Common的便利性。无论您的数据集是否包含此类值,您都不必调整正则表达式。

另请注意,当您将数字视为数字而不是一系列字符时,比较数字会更容易。 -100是一个三位数字,但肯定不是>= 100

答案 1 :(得分:3)

唯一的技巧是确保3位数字之前没有小数点。

use strict;
use warnings;

while (<DATA>) {
    if (/^(?!AB).*\b(?<!\.)\d{3,}(?:\.\d*)?%/) {
        print;
    }
}
__DATA__
AA whatevs 102.342% dontcare #MATCH
AB whatevs 102.342% dontcare #MISMATCH due to AB
AC whatevs 12.3042% dontcare #MISMATCH
AD whatevs 102% dontcare #MATCH *
AE whatevs 2002.3042% dontcare #MATCH
AF whatevs 22.3021% dontcare #MISMATCH
AG whatevs 102.342 12.342% dontcare #MISMATCH

输出:

AA whatevs 102.342% dontcare #MATCH
AD whatevs 102% dontcare #MATCH *
AE whatevs 2002.3042% dontcare #MATCH