ali*_*nia 2 regex floating-point perl 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 **
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有以下正则表达式解决方案,它没有AD whatevs 102% dontcare明显的原因捕获.
/^(?!AB).*\d{3}\.\d*%/
Run Code Online (Sandbox Code Playgroud)
/^(?!AB).*\d{3}\.?\d*%/也不起作用,因为它匹配AF whatevs 22.3021% dontcare.
我知道我可以通过将我的正则表达式分成两个子正则表达式来实现它..但是,我想看看是否有一个正则表达式解决方案.
正如您所注意到的,有很多不同的方法来表示浮点数.您可以使用它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
Run Code Online (Sandbox Code Playgroud)
AA whatevs 102.342% dontcare #MATCH
AD whatevs 102% dontcare #MATCH *
AE whatevs 2002.3042% dontcare #MATCH
AH whatevs 1.02342E02% dontcare #MATCH
Run Code Online (Sandbox Code Playgroud)
我在数据集中添加了一个负数和一个指数,以证明使用的方便性Regexp::Common.无论您的数据集是否包含此类值,您都不必调整正则表达式.
另请注意,将数字视为数字而不是一系列字符时,比较数字会更容易.-100是一个三位数字,但肯定不是>= 100.