Задача под рукой: я пытаюсь подготовить к печати определенный список автоматически сгенерированных идентификаторов. Они имеют формат aa-bb-cc-dd-ee-ff-gg ... каждый кортеж можно выбрать с помощью [a-zA-Z0-9] + (неопределенной длины), разделителями являются [-] (max один).
В каждом идентификаторе может быть от одного до девяти кортежей. Если идентификатор 3 кортежа или меньше, я бы вернул одну группу. Если идентификатор больше 3 кортежей (4+), я бы вернул две группы, первая из которых состоит из 3 кортежей, а вторая из остальных.
Одновременно обрабатывается только одна строка. Вот набор тестов:
one1
one1-two2
one1-two2-three3
one1-two2-three3-4a
one1-two2-three3-4a-5a
one1-two2-three3-4a-5a-6a
one1-two2-three3-4a-5a-6a-7a
Конкретно это будет означать:
one1 -> {"one1"}
one1-two2 -> {"one1-two2"}
one1-two2-three3 -> {"one1-two2-three3"}
one1-two2-three3-4a -> {"one1-two2-three3", "4a"}
one1-two2-three3-4a-5a -> {"one1-two2-three3", "4a-5a"}
one1-two2-three3-4a-5a-6a -> {"one1-two2-three3", "4a-5a-6a"}
one1-two2-three3-4a-5a-6a-7a -> {"one1-two2-three3", "4a-5a-6a-7a"}
Работа, проделанная до сих пор (это всегда правильно выбирает первую группу)
(^[a-zA-Z0-9]+$)|(^[a-zA-Z0-9]+[-][a-zA-Z0-9]+$)|(^[a-zA-Z0-9]+[-][a-zA-Z0-9]+[-][a-zA-Z0-9]+$)|(^[a-zA-Z0-9]+[-][a-zA-Z0-9]+[-][a-zA-Z0-9]+)
Чего я пытаюсь достичь: начать с конца группы захвата, проверить, не является ли это концом строки, начать читать после первого символа '-', следующего за этой точкой, сопоставить до конца строки ,
Дополнительная информация: я использую встроенный в Java движок регулярных выражений.