Сопоставление полного повторяющегося шаблона

#regex #repeat

#регулярное выражение #повторение

Вопрос:

Кажется, я не могу понять это регулярное выражение https://regex101.com/r/cQ9nK8/38

Они должны совпадать

  • Январь.313
  • Январь
  • Январь.31.Февраль.6
  • GMI3.0.N.1
  • Январь.31.Февраль.6.Март.7

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

  • Апрель.Май

Как вы можете видеть, они совпадают по отдельности, но не в целом, я думал, что это сработает, но это не так

 (?:[[:alnum:]] (?:.d )*)*
 

Ответ №1:

Вы можете использовать повторяющийся шаблон:

  • Первое совпадение [[:alpha:]] , за которым следует необязательное [[:alnum:]] (если первая из 2 частей, разделенных точкой, не должна начинаться с цифры)

    Это будет соответствовать January

  • За которым следует необязательная часть, соответствующая digit

    Это будет соответствовать January.313

  • Необязательно повторять точку, за которой следует тот же шаблон

    Это будет соответствовать последним 3 примерам.

Шаблон

 ^[[:alpha:]][[:alnum:]]*(?:.[[:digit:]] (?:.[[:alpha:]][[:alnum:]]*.[[:digit:]] )*)?$
 

Демонстрация регулярных выражений

Версия без обозначения POSIX может быть

 ^[a-zA-Z][a-zA-Z0-9]*(?:.[0-9] (?:.[a-zA-Z][a-zA-Z0-9]*.[0-9] )*)?$
 
  • ^ Начало строки
  • [a-zA-Z][a-zA-Z0-9]* Сопоставьте символ a-zA-Z, за которым необязательно следует a-zA-Z и цифры
  • (?: не группа захвата
    • .[0-9] Сопоставьте a . и 1 цифры
    • (?:.[a-zA-Z][a-zA-Z0-9]*.[0-9] )* При необходимости повторите сопоставление . символа a-zA-Z, за которым необязательно следует a-zA-Z и цифры, точка и цифры
  • )? Закройте группу и сделайте ее необязательной
  • $ Конец строки

Демонстрация регулярных выражений

Комментарии:

1. @JvdV Первый не соответствует, но он довольно подробный

2. Спасибо, это мое последнее регулярное выражение ‘^ [ w d] * (?: .[ d] (?: .[ w] * .[ d] )*)?$’ после обработки других угловых случаев с помощью ‘_’ и несопоставление по этому — Aptil.7.Может

3. Обратите внимание, что это w также соответствует d

Ответ №2:

Вот моя попытка:

 ^((?:^|.)[A-Z][A-Zd]*(?:$|.d ))(?1)*$
 

Смотрите онлайн-демонстрацию


  • ^ — Запуск строки ancor.
  • ( — Откройте 1-ю группу захвата / шаблон.
    • (?: — Открыть группу без захвата.
      • ^|. — Начальная строка или буквенная точка.
      • ) — Закрыть группу без захвата.
    • [A-Z][A-Zd]* — Одна буква, за которой следует ноль или более букв или цифр.
    • (?: — Открыть группу без захвата.
      • $|. — Конечная строка или буквенная точка.
      • ) — Закрыть группу без захвата. ) — Закрыть 1-ю группу захвата / шаблон.
  • (?1)* — Повторите группу захвата / шаблон ноль или более раз.
  • $ — Конец строки ancor.

Кстати, я использую сопоставление без учета регистра.

Комментарии:

1. Спасибо, ваш ответ также полезен, но моя окончательная реализация очень близка к @The-fourth-bird