正则表达式:5位数递增

时间:2010-07-03 13:44:20

标签: regex

我需要增加5位数的正则表达式,例如123452457934680,等等。

0位于9之后。

4 个答案:

答案 0 :(得分:34)

您可以尝试(as seen on rubular.com

^(?=\d{5}$)1?2?3?4?5?6?7?8?9?0?$

解释

  • ^$分别是字符串锚点的开头和结尾
  • \d{5}是数字字符类\d完全重复{5}
  • (?=...)是一个积极的向前看
  • 每个数字
  • ?使每个可选

如何运作

  • 首先我们使用lookahead断言锚定在字符串的开头,我们可以看到\d{5}直到字符串的结尾
  • 现在我们知道我们有5个数字,我们只是按照我们想要的顺序匹配数字,但是每个数字都是可选的
    • 断言确保我们有正确的位数

regular-expressions.info


概括技术

假设我们需要匹配包含以下内容的字符串:

  • 在1-3个元音[aeiou]
  • 之间
  • 元音必须按顺序出现

然后模式是(as seen on rubular.com):

^(?=[aeiou]{1,3}$)a?e?i?o?u?$

同样,它的工作方式是:

  • 锚定在字符串的开头,我们首先断言(?=[aeiou]{1,3}$)
    • 因此字符串中的字母正确,且长度正确
  • 然后我们按顺序测试每个字母,使每个字母都可选,直到字符串结束

允许重复

如果每个数字都可以重复,例如11223是匹配,然后:

  • 而不是每个数字上的?(零或一),
  • 我们使用*(零次或多次重复)

即,模式是(as seen on rubular.com):

^(?=\d{5}$)1*2*3*4*5*6*7*8*9*0*$

答案 1 :(得分:12)

错误的工作工具。只需逐个遍历字符并检查它。你将如何做到这一点取决于你使用的语言。

以下是使用C:

进行检查的方法
#include <stdio.h>
#define CHR2INT(c) c - '0'

int main(void)
{
    char *str = "12345";
    int i, res = 1;

    for (i = 1; i < 5; ++i) {
        res &= CHR2INT(str[i - 1]) < CHR2INT(str[i]) && str[i] >= '0' && str[i] <= '9';
    }

    printf("%d", res);

    return 0;
}

它显然比正则表达式解决方案更长,但正则表达式解决方案永远不会那么快。

答案 2 :(得分:6)

这不是正则表达式有用的东西。你需要实现的正则表达式可能比简单的程序代码更大,更丑陋,可以做同样的事情。

一定要使用正则表达式来确保字符串中有五位数字,然后只使用正常的编码检查来确保顺序正确。

你不要用螺丝刀钉在钉子上(如果你很聪明的话),不要试图为每件工作使用常规表达: - )

答案 3 :(得分:6)

polygenelubricants的建议是一个很好的建议,但是有一个更好的建议,那就是使用更简单的先行约束,因为大部分RE都会检查字符的数字。为什么,请参阅交互式Tcl会话的此日志:

% set RE1 "^(?=\\d{5}$)1?2?3?4?5?6?7?8?9?0?$"
^(?=\d{5}$)1?2?3?4?5?6?7?8?9?0?$
% set RE2 "^(?=.{5}$)1?2?3?4?5?6?7?8?9?0?$"
^(?=.{5}$)1?2?3?4?5?6?7?8?9?0?$
% time {regexp $RE1 24579} 100000
32.80587355 microseconds per iteration
% time {regexp $RE2 24579} 100000
22.598555649999998 microseconds per iteration

正如您所看到的,使用带有.{5}$的RE版本作为先行约束,至少在Tcl RE引擎中使用它的速度提高了约30%。 (注意,上面的日志错过了我正在稳定正则表达式编译的一些行,尽管我预计RE2的编译速度要快一些。)如果你使用的是另一个RE引擎(例如,PCRE或Perl)然后你应该重新检查以获得自己的表现数据。