Регулярное выражение: 5 цифр в порядке возрастания
Мне нужно регулярное выражение для 5 цифр в порядке возрастания, например 12345
, 24579
, 34680
и т.д.
0
появляется после 9
.
Ответы
Ответ 1
Вы можете попробовать (как видно на rubular.com)
^(?=\d{5}$)1?2?3?4?5?6?7?8?9?0?$
Объяснение
-
^
и $
- начало и конец якорей строк соответственно
-
\d{5}
- это знак символьного класса \d
, точно повторяющийся {5}
times
-
(?=...)
является положительным взглядом
-
?
на каждой цифре делает каждый дополнительный
Как это работает
- Сначала мы используем lookahead для утверждения, привязанного в начале строки, мы можем видеть
\d{5}
до конца строки
- Теперь, когда мы знаем, что у нас есть 5 цифр, мы просто сопоставляем цифры в том порядке, который мы хотим, но делая каждую цифру необязательной
- Утверждение гарантирует, что мы имеем правильное количество цифр
regular-expressions.info
Обобщение техники
Скажем, что нам нужно сопоставить строки, состоящие из:
- между 1-3 гласными
[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*$
Ответ 2
Неправильный инструмент для работы. Просто перебирайте символы по одному и проверяйте их. Как вы это сделаете, зависит от того, какой язык вы используете.
Вот как проверить с помощью 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;
}
Это, очевидно, длиннее решения регулярных выражений, но решение регулярных выражений никогда не будет таким быстрым.
Ответ 3
Это не то, что подходит для регулярных выражений. Такое регулярное выражение, которое вам нужно будет выполнить, скорее всего, будет большим и уродливым, чем простой процедурный код, чтобы сделать то же самое.
Во всех смыслах используйте регулярное выражение, чтобы убедиться, что у вас есть пять цифр в вашей строке, но затем просто используйте обычные проверки кодировки, чтобы убедиться, что порядок верен.
Вы не стучите ногтями отверткой (если вы умны), не пытайтесь использовать регулярные выражения для каждой работы: -)
Ответ 4
предложение полигенных смазочных материалов является отличным, но там лучше, и для использования более простого ограничения вида, учитывая, что основная часть 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), то вы должны перепроверить, чтобы получить свои собственные показатели производительности.