我需要增加5位数的正则表达式,例如12345
,24579
,34680
,等等。
0
位于9
之后。
答案 0 :(得分:34)
您可以尝试(as seen on rubular.com)
^(?=\d{5}$)1?2?3?4?5?6?7?8?9?0?$
^
和$
分别是字符串锚点的开头和结尾\d{5}
是数字字符类\d
完全重复{5}
次(?=...)
是一个积极的向前看?
使每个可选\d{5}
直到字符串的结尾假设我们需要匹配包含以下内容的字符串:
[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)然后你应该重新检查以获得自己的表现数据。