Мне нужно регулярное выражение для 5 цифр в порядке возрастания, например 12345
, 24579
, 34680
и т.д.
0
появляется после 9
.
Мне нужно регулярное выражение для 5 цифр в порядке возрастания, например 12345
, 24579
, 34680
и т.д.
0
появляется после 9
.
Вы можете попробовать (как видно на rubular.com)
^(?=\d{5}$)1?2?3?4?5?6?7?8?9?0?$
^
и $
- начало и конец якорей строк соответственно\d{5}
- это знак символьного класса \d
, точно повторяющийся {5}
times(?=...)
является положительным взглядом?
на каждой цифре делает каждый дополнительный\d{5}
до конца строкиСкажем, что нам нужно сопоставить строки, состоящие из:
[aeiou]
Тогда шаблон (как видно на rubular.com):
^(?=[aeiou]{1,3}$)a?e?i?o?u?$
Опять же, как это работает:
(?=[aeiou]{1,3}$)
Если каждая цифра может повторяться, например. 11223
является совпадением, затем:
?
(нуль-один) на каждой цифре,*
(ноль или более повторение)То есть шаблон (как видно на rubular.com):
^(?=\d{5}$)1*2*3*4*5*6*7*8*9*0*$
Неправильный инструмент для работы. Просто перебирайте символы по одному и проверяйте их. Как вы это сделаете, зависит от того, какой язык вы используете.
Вот как проверить с помощью 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;
}
Это, очевидно, длиннее решения регулярных выражений, но решение регулярных выражений никогда не будет таким быстрым.
Это не то, что подходит для регулярных выражений. Такое регулярное выражение, которое вам нужно будет выполнить, скорее всего, будет большим и уродливым, чем простой процедурный код, чтобы сделать то же самое.
Во всех смыслах используйте регулярное выражение, чтобы убедиться, что у вас есть пять цифр в вашей строке, но затем просто используйте обычные проверки кодировки, чтобы убедиться, что порядок верен.
Вы не стучите ногтями отверткой (если вы умны), не пытайтесь использовать регулярные выражения для каждой работы: -)
предложение полигенных смазочных материалов является отличным, но там лучше, и для использования более простого ограничения вида, учитывая, что основная часть 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
Как вы можете видеть, примерно на 30% быстрее использовать версию RE с .{5}$
в качестве ограничения на просмотр, по крайней мере, в движке Tcl RE. (Обратите внимание, что в приведенном выше журнале отсутствуют некоторые строки, в которых я стабилизировал компиляции регулярных выражений, хотя я бы предпочла, чтобы RE2 был немного быстрее, чтобы скомпилировать.) Если вы используете другой механизм RE (например, PCRE или Perl), то вы должны перепроверить, чтобы получить свои собственные показатели производительности.