Регулярное выражение: 5 цифр в порядке возрастания - PullRequest
14 голосов
/ 03 июля 2010

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

0 идет после 9.

Ответы [ 4 ]

34 голосов
/ 03 июля 2010

Вы можете попробовать ( как видно на rubular.com )

^(?=\d{5}$)1?2?3?4?5?6?7?8?9?0?$

Объяснение

  • ^ и $ являются началом иконец якоря строки соответственно
  • \d{5} - это класс символов из цифр \d, повторенный в точности {5} раз
  • (?=...) - положительный прогноз
  • ?на каждую цифру добавляется каждый необязательный

Как это работает

  • Сначала мы используем прогнозирование, чтобы утверждать, что якорь в начале строки, мы можем видеть \d{5} доконец строки
  • Теперь, когда мы знаем, что у нас есть 5 цифр, мы просто сопоставляем цифры в нужном нам порядке, но делая каждую цифру необязательной
    • Утверждение гарантирует, что мы имеем правильныйколичество цифр

регулярные выражения * info


Обобщениеhnique

Допустим, нам нужно сопоставить строки, состоящие из:

  • между 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*$
12 голосов
/ 03 июля 2010

Неправильный инструмент для работы. Просто перебирайте символы один за другим и проверяйте это. Как вы это сделаете, зависит от того, какой язык вы используете.

Вот как проверить, используя 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;
}

Очевидно, что оно длиннее решения регулярных выражений, но решение регулярных выражений никогда не будет таким быстрым

6 голосов
/ 03 июля 2010
Предложение

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

Как вы можете видеть, примерно на 30% быстрее использовать версию RE с .{5}$ в качестве ограничения на будущее, по крайней мере, в движке Tcl RE. (Обратите внимание, что в приведенном выше журнале пропущены некоторые строки, в которых я стабилизировал компиляцию регулярных выражений, хотя я ожидаю, что RE2 все равно будет немного быстрее компилироваться.) Если вы используете другой механизм RE (например, PCRE или Perl), тогда вы должны перепроверить, чтобы получить свои собственные показатели производительности.

6 голосов
/ 03 июля 2010

Регулярные выражения не годятся для этого.Вид регулярного выражения, который вам понадобится для достижения этой цели, вероятно, будет больше и уродливее, чем простой процедурный код, чтобы сделать то же самое.строка, но затем просто используйте обычные проверки кодирования, чтобы убедиться, что порядок правильный.

Вы не стучите гвоздями отверткой (если вы умны), не пытайтесь использовать регулярные выражения для каждой работылибо: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...