正则表达式:5位数递增

DEA*_*NET 15 regex

我需要增加的顺序,像正则表达式为5位数字12345,24579,34680,等等.

0来之后9.

pol*_*nts 34

你可以尝试(如rubular.com上所见)

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

说明

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

这个怎么运作

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

regular-expressions.info


概括技术

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

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

然后是模式(如rubular.com上所示):

^(?=[aeiou]{1,3}$)a?e?i?o?u?$
Run Code Online (Sandbox Code Playgroud)

同样,它的工作方式是:

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

允许重复

如果每个数字都可以重复,例如11223匹配,那么:

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

也就是说,模式是(如rubular.com上所示):

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

  • 我已经把`.{5} $`作为前瞻约束,因为数字约束由RE的其他部分检查; 使用至少一个RE引擎(Tcl one),匹配`24579`时速度提高约30%,并且它与完全相同的语言匹配. (3认同)
  • 这就是为什么我讨厌对这样的正则表达式的扩展充满激情.它鼓励进一步滥用已经滥用的工具. (2认同)

Dan*_*erg 13

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

以下是如何使用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;
}
Run Code Online (Sandbox Code Playgroud)

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


pax*_*blo 6

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

无论如何使用正则表达式来确保您的字符串中有五位数字,但只需使用正常的编码检查以确保顺序正确.

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


Don*_*ows 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
Run Code Online (Sandbox Code Playgroud)

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