Regex, чтобы соответствовать сигнатуре метода Java - PullRequest
0 голосов
/ 09 июня 2010

У меня есть это конкретное требование, когда метод должен быть идентифицирован разными регулярными выражениями для разных компонентов. Например, необходимо указать регулярное выражение для возвращаемого параметра, одно для имени метода, одно для типа аргумента и одно для имени аргумента. До этого шага я смог придумать выражение:

([^,]+) ([^,]+)\((([^,]+) ([^,]+))\)

Хорошо работает для сигнатуры метода, например -

ReturnType foo (параметр Arg) Регулярное выражение идентифицирует ReturnType, foo, Arg и параметр отдельно.

Теперь проблема в том, что метод не может иметь / один / несколько аргументов, разделенных запятыми. Я не могу получить повторяющееся выражение для этого. Помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 09 июня 2010

Давайте немного отвлечемся и скажем, что мы хотим сопоставить (возможно, пустой) список цифр, разделенных запятыми.

(empty)
12
12,34
12,34,56

Следовательно, шаблон

^$|^\d+(,\d+)*$

Теперь вы можете попробовать заменить компоненты так, как вам нужно:

  • Вместо \d+, любое регулярное выражение, которое вы используете для соответствия имени типа и идентификатора
  • Может быть, разрешить \s* вокруг запятой
  • Может быть, вы даже добавите последний аргумент специальной переменной varargs (который также может быть первым и единственным)

Обратите внимание, что если вы разрешите параметры универсального типа, то вы определенно не сможете использовать регулярные выражения, поскольку вы можете вкладывать <...>, а язык сбалансированных сбалансированных скобок произвольной глубины не является регулярным.

Хотя вы можете утверждать, что на практике никто никогда не будет вкладывать параметры типа глубже, чем, скажем, 3 уровня, так что тогда он снова станет регулярным.

Тем не менее, правильный парсер действительно лучший инструмент для этого. Просто посмотрите на реализацию грамматики Java, скажем, в ANTLR.


Смотри также

1 голос
/ 09 июня 2010

Если вы решите пойти по пути использования регулярных выражений / строк, вы можете вытащить всю строку аргумента, разделить ее запятыми и разбить получившиеся строки на пустое пространство.

Хотя я бы согласился с комментарием JaredPar по вашему вопросу, по крайней мере, если вы ожидаете, что сможете использовать все возможности, которые действительны в Java API.

Например, есть ряд ключевых слов, которые могут использовать префикс вашего метода (public / private, static, final). Существует также возможность аннотаций как для метода, так и для параметров. Простое использование табуляции или новой строки между возвращаемым значением вместо пробела нарушит текущее регулярное выражение.

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...