#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