Подтвердить что ты не робот

Регулярное выражение: 5 цифр в порядке возрастания

Мне нужно регулярное выражение для 5 цифр в порядке возрастания, например 12345, 24579, 34680 и т.д.

0 появляется после 9.

4b9b3361

Ответ 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), то вы должны перепроверить, чтобы получить свои собственные показатели производительности.