是否有一个简单的正则表达式将数字与x进行比较?

时间:2011-12-23 19:57:15

标签: regex

如果数字大于或等于任意数字,我想要一个匹配的正则表达式。对于这样一个简单的任务来说,这看起来非常复杂......似乎你需要在一个为x手工制作的显式正则表达式中重新发明“计数”。

例如,直观地对大于25的数字执行此操作,我得

(\d{3,}|[3-9]\d|2[6-9]\d)

如果数字是512345怎么办?有更简单的方法吗?

4 个答案:

答案 0 :(得分:4)

似乎没有更简单的方法。正则表达式不是数字的东西 你可以尝试这个:

\[1-9]d{6,}|
[6-9]\d{5}|
5[2-9]\d{4}|
51[3-9]\d{3}|
512[4-9]\d{2}|
5123[5-9]\d|
51234[6-9]

(为了清晰起见,换行符)

答案 1 :(得分:4)

  

如果数字是512345怎么办?有更简单的方法吗?

不,匹配某个范围内的数字的正则表达式看起来很糟糕(特别是大数字范围)。

正则表达式根本不适用于此类任务。更好的解决方案是&#34;自由地&#34;匹配数字,例如\d+,然后将其与语言的关系运算符(<>,...)进行比较。

答案 2 :(得分:1)

在Perl中,您可以使用(?(condition)yes-pattern)(condition)的条件regexp构造(?{CODE})来运行任意Perl代码。如果您使yes-pattern成为(*FAIL),那么您将拥有一个仅在CODE返回false时成功的正则表达式片段。因此:

foreach (0 .. 50) {
    if (/\A(\d+)(?(?{$1 <= 25})(*FAIL))\z/) {
        say "$_ matches";
    }
    else {
        say "$_ does not match";
    }
}

代码评估功能曾经被标记为实验性的,但是最新的&#39; perlre&#39;手册页(http://perldoc.perl.org/perlre.html)现在似乎意味着它是一种核心语言功能。

从技术上讲,你所拥有的不再是一个正常的表达方式&#39;当然,还有一些正则表达式和外部代码的混合。

答案 3 :(得分:0)

我从来没有听说过可以做到这一点的正则表达式。编写一个Perl模块来生成适当的正则表达式(正如您在评论中提到的)对我来说听起来不错。事实上,如果还没有完成,我会感到惊讶。首先检查CPAN。

顺便说一下,除了指出的多余管道Yuriy之外,你的正则表达式还包含一些错误。

  • 首先,“三位或更多位数”部分将匹配02400000007等无效数字。您可以通过要求第一个数字大于零来解决这个问题。如果您想允许前导零,可以单独匹配它们。

  • 第三部分2[6-9]\d仅匹配数字&gt; = 260.也许您打算将第三个数字设为可选(即2[6-9]\d?),但这将是多余的。

  • 您应该以某种方式锚定正则表达式,以确保您不匹配较长数字的一部分或与其中的数字匹配的“单词”。我不知道在你的特定情况下做到这一点的最好方法,但是字边界(即\b)可能就是你所需要的。

最终结果:

\b0*([1-9]\d{2,}|[3-9]\d|2[6-9])\b