【问题标题】:Matching floating point numbers >= 100匹配浮点数 >= 100
【发布时间】:2014-10-11 19:27:16
【问题描述】:

我正在逐行读取文件,并希望得到以任何而不是 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

我知道我可以通过基于. 的存在将我的正则表达式分成两个子正则表达式来做到这一点。不过,我想看看是否有单一的正则表达式解决方案。

【问题讨论】:

  • 试试这个/^(?!AB).*\d{3}(\.\d+)?%/(未测试)

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


【解决方案1】:

您已经注意到,有很多不同的方式来表示浮点数。您可以使用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 是三位数字,但肯定不是 &gt;= 100

【讨论】:

    【解决方案2】:

    唯一的窍门是确保 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
    

    【讨论】:

    • 你太快了! @谢谢米勒。我也解决了这个问题。您能否在您的正则表达式中添加一些 cmets... 仍在尝试感知。
    猜你喜欢
    • 2018-02-17
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 2015-10-30
    • 1970-01-01
    相关资源
    最近更新 更多