regex - 使用正则表达式比较数字

标签 regex

所以这是一个明显的“你做错了”的例子。我实际上并不打算这样做,但工作中的一次谈话引发了这个问题:

Can you generate a regular expression to determine if an integer is less than an arbitrary value.



对于某些值,这很容易。对于小于 1000 的整数,\d{1,3} 应该可以解决问题。对于小于 500 的整数,这有点棘手,但也不错,因为您可以使用 [0-4]{0,1}\d{1,2}。

一旦你得到任意值,它就会变得更加狡猾。例如,所有小于 255 的数字将类似于\d{1,2} | [0-1]\d{2}|[2][0-4]\d | [2][5][0-4]。

是否有一个在这里工作的正则表达式?还是必须以编程方式生成正则表达式?

(再说一次,让我指出我无意这样做。显然,在您最喜欢的编程语言中使用“foo < bar”效率更高且易于阅读。)

最佳答案

这很容易。

#!/usr/bin/env perl
use strict;
use warnings;
use Regexp::Assemble;

for my $n (@ARGV)  {
    my $asm = new Regexp::Assemble;
    for (1 .. $n) { $asm->add($_) }
    for ($asm->re){
        s/\)$/\$/;
        s/^[^:]*:/^/;
        print "$n => /$_/\n";
    }
}

现在运行它以查找匹配 1 和该数字之间的整数的模式:
$ perl /tmp/ra 5 15 153 401 1144
5 => /^[12345]$/
15 => /^(?:[23456789]|1[012345]?)$/
153 => /^(?:1(?:[6789]|5[0123]?|0\d?|1\d?|2\d?|3\d?|4\d?)?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)$/
401 => /^(?:1(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|2(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|3(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|4(?:[123456789]|0[01]?)?|5\d?|6\d?|7\d?|8\d?|9\d?)$/
1144 => /^(?:1(?:0(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|1(?:[56789]|4[01234]?|0\d?|1\d?|2\d?|3\d?)?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|2(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|3(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|4(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|5(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|6(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|7(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|8(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|9(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?)$/

关于regex - 使用正则表达式比较数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9434844/

相关文章:

java - Java中的正则表达式不断丢失数据

python - 使用 python 获取 javascript 变量

python正则表达式多重查找

python - 捕获不包含牛津逗号的单词列表

SQL Server 正则表达式

javascript - 用单个 <br> 替换 javascript 中的多个 <br>?

正则表达式 - 如何匹配除特定模式之外的所有内容

java - 负向Lookbehind排除java中特定长度的单词

正则表达式点是否带方括号

javascript - 使用 javascript 从 HTML 转换为文本时出现问题