Давайте немного отвлечемся и скажем, что мы хотим сопоставить (возможно, пустой) список цифр, разделенных запятыми.
(empty)
12
12,34
12,34,56
Следовательно, шаблон
^$|^\d+(,\d+)*$
Теперь вы можете попробовать заменить компоненты так, как вам нужно:
- Вместо
\d+
, любое регулярное выражение, которое вы используете для соответствия имени типа и идентификатора
- Может быть, разрешить
\s*
вокруг запятой
- Может быть, вы даже добавите последний аргумент специальной переменной varargs (который также может быть первым и единственным)
Обратите внимание, что если вы разрешите параметры универсального типа, то вы определенно не сможете использовать регулярные выражения, поскольку вы можете вкладывать <...>
, а язык сбалансированных сбалансированных скобок произвольной глубины не является регулярным.
Хотя вы можете утверждать, что на практике никто никогда не будет вкладывать параметры типа глубже, чем, скажем, 3 уровня, так что тогда он снова станет регулярным.
Тем не менее, правильный парсер действительно лучший инструмент для этого. Просто посмотрите на реализацию грамматики Java, скажем, в ANTLR.
Смотри также