это мое регулярное выражение:
([+-]*)(\\d+)\\s*([a-zA-Z]+)
- группа №1 = знак
- группа no.2 = множитель
- группа № 3 = единица времени
Дело в том, что я хотел бы сопоставить данный ввод, но он может быть "цепным". Поэтому мой ввод должен быть действительным тогда и только тогда, когда весь шаблон повторяется без каких-либо событий между этими вхождениями (за исключением пробелов). (Только одно совпадение или несколько совпадений рядом друг с другом с возможными пробелами между ними).
действительные примеры:
1day
+1day
-1 day
+1day-1month
+1day +1month
+1day +1month
Недопустимые примеры:
###+1day+1month
+1day###+1month
+1day+1month###
###+1day+1month###
###+1day+1month###
В моем случае я могу использовать метод matcher.find(), это сделало бы трюк, но он примет вход вроде этого: +1day###+1month
, который недействителен для меня.
Любые идеи? Это можно решить с помощью нескольких условий IF и нескольких проверок для начальных и конечных индексов, но я ищу элегантное решение.
ИЗМЕНИТЬ
Предлагаемое регулярное выражение в комментариях ниже ^\s*(([+-]*)(\d+)\s*([a-zA-Z]+)\s*)+$
будет частично выполнять трюк, но если я его использую в коде ниже, он возвращает другой результат, чем результат, который я ищу.
Проблема в том, что я не могу использовать (*my regex*)+
, потому что он будет соответствовать всему.
Решение может состоять в том, чтобы сопоставить весь ввод с ^\s*(([+-]*)(\d+)\s*([a-zA-Z]+)\s*)+$
, а затем использовать ([+-]*)(\\d+)\\s*([a-zA-Z]+)
с matcher.find()
и matcher.group(i)
, чтобы извлечь каждое соответствие и его группы. Но я искал более элегантное решение.