如果数字大于或等于任意数字,我想要一个匹配的正则表达式。对于这样一个简单的任务来说,这看起来非常复杂......似乎你需要在一个为x手工制作的显式正则表达式中重新发明“计数”。
例如,直观地对大于25的数字执行此操作,我得
(\d{3,}|[3-9]\d|2[6-9]\d)
如果数字是512345怎么办?有更简单的方法吗?
答案 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怎么办?有更简单的方法吗?
不,匹配某个范围内的数字的正则表达式看起来很糟糕(特别是大数字范围)。
正则表达式根本不适用于此类任务。更好的解决方案是"自由地"匹配数字,例如\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之外,你的正则表达式还包含一些错误。
首先,“三位或更多位数”部分将匹配024
和00000007
等无效数字。您可以通过要求第一个数字大于零来解决这个问题。如果您想允许前导零,可以单独匹配它们。
第三部分2[6-9]\d
仅匹配数字&gt; = 260.也许您打算将第三个数字设为可选(即2[6-9]\d?
),但这将是多余的。
您应该以某种方式锚定正则表达式,以确保您不匹配较长数字的一部分或与其中的数字匹配的“单词”。我不知道在你的特定情况下做到这一点的最好方法,但是字边界(即\b
)可能就是你所需要的。
最终结果:
\b0*([1-9]\d{2,}|[3-9]\d|2[6-9])\b