Использование регулярных выражений для сопоставления чисел, которые имеют 5 возрастающих последовательных цифр где-то в них - PullRequest
0 голосов
/ 26 января 2019

Во-первых, это вроде как спрашивалось до .Однако я не смог изменить это, чтобы соответствовать моим требованиям.

Вкратце: я хочу, чтобы регулярное выражение соответствовало выражению тогда и только тогда, когда оно содержит только цифры, и где-то в выражении есть 5 (или более) последовательных цифр.

Я понимаюлогика

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

однако это ограничивает выражение до 5 цифр.Я хочу, чтобы там были цифры до и после выражения.Так что 1111345671111 должно совпадать, а 11111 не должно.

Я думал, что это может сработать:

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

, который я интерпретирую как:

  • ^$: все выражение должно содержать только то, что находится междуэти 2 символа

  • [0-9]*: любые цифры от 0 - 9, 0 или более раз, за ​​которыми следует:

  • (?=\d{5}0*1*2*3*4*5*6*7*8*9*): часть, где найдено не менее 5 возрастающих цифр, за которыми следуют:

  • [0-9]*: любые цифры между 0 - 9, 0 или более раз.

Однако это регулярное выражение неверно, например, 11111 соответствует.Как я могу решить эту проблему с помощью регулярных выражений?Поэтому примеры выражений для соответствия:

  • 00001459000
  • 12345

Это не должно совпадать:

  • abc12345
  • 9871234444

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Хотя эту проблему можно решить с помощью чисто регулярных выражений (набор строго восходящих пятизначных строк конечен, так что вы можете просто перечислить все из них), он не подходит для регулярных выражений.

Тем не менее, вот как бы я это сделал, если бы мне пришлось:

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

Основная идея: 0?1?2?3?4?5?6?7?8?9? соответствует возрастающей числовой подстроке, но не ограничивает ее длину.Каждая отдельная часть является необязательной, поэтому она может соответствовать чему угодно, от "" (пустая строка) до полной "0123456789".

. Мы можем заставить ее совпадать ровно с 5 символами, комбинируя упреждающий просмотр из пяти цифри произвольный суффикс (который мы фиксируем) и обратная ссылка \1 (которая должна в точности соответствовать суффиксу, соответствующему прогнозу, гарантируя, что мы теперь опередили 5 символов в строке).

Демонстрация в реальном времени: https://regex101.com/r/03rJET/3

(Кстати, ваше объяснение (?=\d{5}0*1*2*3*4*5*6*7*8*9*) неверно: оно рассчитывает на совпадение ровно 5 цифр, за которыми следуют 0 или более вхождений 0, а затем 0 или более вхождений1 и т. д.)

0 голосов
/ 26 января 2019

Поскольку начальная позиция увеличивающихся цифр заранее не известна, а последовательные увеличивающиеся цифры не заканчиваются в конце строки, краткий шаблон связанного ответа здесь не сработает. Я не думаю, что это возможно без повторения; чередовать все возможности увеличения цифр. За 0 должно следовать [1-9]. (0(?=[1-9])) За 1 должно следовать [2-9]. За 2 должно следовать [3-9] и так далее. Чередуйте эти возможности в группе и повторите эту группу четыре раза, а затем сопоставьте любую цифру после этого (просмотр последней повторяющейся цифры в предыдущей группе обеспечит Пятая цифра также в последовательности).

Сначала lookahead для цифр, за которыми следует конец строки, затем сопоставьте описанные выше чередования, за которыми следуют одна или несколько цифр:

^(?=\d+$)\d*?(?:0(?=[1-9])|1(?=[2-9])|2(?=[3-9])|3(?=[4-9])|4(?=[5-9])|5(?=[6-9])|6(?=[7-9])|7(?=[89])|8(?=9)){4}\d+

Выделен для лучшей читаемости:

^(?=\d+$)\d*?
  (?:
    0(?=[1-9])|
    1(?=[2-9])|
    2(?=[3-9])|
    3(?=[4-9])|
    4(?=[5-9])|
    5(?=[6-9])|
    6(?=[7-9])|
    7(?=[89])|
    8(?=9)
  ){4}
\d+

Ленивый квантификатор в первой строке \d*? не необходим , но делает шаблон немного более эффективным (в противном случае он изначально жадно сопоставляет всю строку, требуя множества неудачных чередований и откат до как минимум 5 символов до конца строки)

https://regex101.com/r/03rJET/2

Это некрасиво, но работает.

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