Строка заданной длины с произвольным (но >0) количеством разделителей?

Задачу уже решил без регекспов, но теперь гложет академический интерес, уже весь вечер бьюсь =)

Нужно сматчить строки из заданного количества цифр (пусть будет 6).
Цифры могут быть разделены произвольным количеством разделителей (пусть будет [-]).
Разделитель должен быть хотя бы один.
Двух разделителей подряд быть не должно.

то есть, матчится:
111-111
11-1111
1-111-11

не матчится:
111111
-111111
111111-
111--111
11-11
1111-1111

Вот такая штука правильно матчит количество, но не учитывает обязательность хотя бы одного разделителя:
(?<=\s)\d(?:[-]?\d){5}(?=\s)
https://regex101.com/r/9sHJSA/1

А вот такая - учитывает обязательность разделителя, но не учитывает количество:
(?<=\s)(?:\d+[-](?=\d))+\d+(?=\s)
https://regex101.com/r/83NFoD/1

Как бы их объединить в одно правило?
  • Вопрос задан
  • 171 просмотр
Пригласить эксперта
Ответы на вопрос 1
@dodo512
Учитывать обязательность хотя бы одного разделителя можно добавлением позитивной опережающей проверки (?=\d{0,4}[-])

(?<=\s)\d(?=\d{0,4}[-])(?:[-]?\d){5}(?=\s)
https://regex101.com/r/9sHJSA/2

Ещё вариант это применить трюк с пустой сохраняющей группой и обратной ссылкой на неё.
Он основан на том, что попытка сопоставления с обратной ссылкой будет терпеть неудачу, если соответствующая ей сохраняющая группа еще не участвовала в сопоставлении.
(?:(?:[-]())?\d){5}\1

(?<=\s)\d(?:(?:[-]())?\d){5}\1(?=\s)
https://regex101.com/r/9sHJSA/3
Такой трюк работает в PHP, Perl, Python, Java и .NET, но вот в JavaScript свои правила для работы с обратными ссылками и этот трюк не работает.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы