Можно ли извлекать вызовы функций с помощью регулярных выражений - PullRequest
1 голос
/ 28 октября 2011

В конкретном примере я хочу извлечь вызовы функций в строковом вводе (скрипт ruby), чтобы сделать некоторую статистику (в java).Для примера ввода:

Math.sqrt(2-Math.hypot((3),4))-factorial(5)

Я хочу получить список possible используемых функций (проверка не должна быть точной на 100%, и она может включать некоторые дополнительные ошибочные предположения):

{ Math.sqrt, Math.hypot, factorial }

Список не должен быть чувствительным к регистру, но он должен включать путь к классу функций, если он существует.

Я пытался наивно упрощенно ".*\\((.*)\\)", но не мог заставить его работать.Кажется, мне нужно использовать ретроспективные ссылки или обратные ссылки, но я немного озадачен.У меня вопрос, могу ли я это сделать?

Ответы [ 4 ]

3 голосов
/ 28 октября 2011

Нет .Вы не можете не должны (см. Редактирование ниже) сделать это.

Регулярные выражения могут соответствовать только обычным языкам, но для сопоставления вызовов функций требуется скобка (), поскольку могут быть вложенные выражения.как ((1+ 2)*3) в вызове функции.Регулярные выражения не могут иметь дело с вложенными скобками.

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

Для решения вашей конкретной проблемыВас могут заинтересовать следующие ресурсы, которые рекомендуют импортировать скрипт ruby ​​и использовать отражение (википедия)


Редактировать : Если все, что вам нужно, это имя функции, возможно, вы можете получить регулярное выражениеработать.Однако:

  • есть и другие проблемные случаи.Например, что бы вы сделали, если бы вызывалась функция-член?конструктор?
  • если вы когда-нибудь захотите собрать больше информации (например, переданных аргументов), вам придется отказаться от своего проекта и начать все сначала.
2 голосов
/ 28 октября 2011

Для вашего примера шаблон:

(?:\\w+\\.)?\\w+(?=\\()

дает желаемый результат, но я уверен, что он не будет идеальным.Если вам нужен быстрый, но грубый результат, это может быть!

0 голосов
/ 28 октября 2011

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

Вот мои мысли ... Я не знаю Руби, поэтому я не уверен, что что-то упустил. Нет необходимости сопоставлять скобки ... открывающая скобка "(" единственная, которая действительно имеет значение, при условии, что в программе нет синтаксических ошибок. Вы можете найти следующую строку

"[A-Za-z_][.A-Za-z_0-9+]*("

В большинстве языков функции начинаются с буквы или символа подчеркивания, за которыми следуют ноль или более непробельных символов без специальных символов. Вот что отражает это выражение. Это будет работать на вашем примере. Конечно, он будет возвращать дубликаты (которые могут быть уникальными) и найдет что-то внутри комментариев, но в качестве быстрого и грязного решения все должно быть в порядке.

0 голосов
/ 28 октября 2011

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

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