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}次数的数字字符类(?=...) 是一个积极的前瞻? 每个数字使每个数字可选\d{5}直到字符串的结尾假设我们需要匹配包含以下内容的字符串:
[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)
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)
它显然比正则表达式解决方案更长,但正则表达式解决方案永远不会那么快.
这不是正则表达式有用的东西.你需要实现这种正则表达式,这可能比简单的程序代码更大,更丑陋,可以做同样的事情.
无论如何使用正则表达式来确保您的字符串中有五位数字,但只需使用正常的编码检查以确保顺序正确.
你不要用螺丝刀钉在钉子上(如果你很聪明的话),不要试图为每个工作使用常规表达:-)
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)然后你应该重新检查以获得自己的性能数据.