Regex: аргументы вызова функции Split - PullRequest
0 голосов
/ 17 октября 2018

Столкнулся с этой проблемой, и я искал несколько дней.Я использую PHP для разбора формул для платформы.

Формула может выглядеть примерно так:

object.Field

ADD(object.NumberOfTHings, object.NumberOfThings)

object.DoSomething(ADD(object.NumberOfTHings, object.NumberOfThings), 'words!')

Идея в том, что она может вкладывать много уровней.Пользователи могут включать кавычки (двойные и одинарные).

Я работаю над функцией, которая возвращает каждый параметр на самом высоком уровне.Поэтому

object.DoSomething(ADD(object.NumberOfTHings, object.NumberOfThings), 'words!')

Потребуется вернуть следующий массив:

  • ADD (object.NumberOfTHings, object.NumberOfThings)
  • 'words!'

Затем мы возвращаемся и анализируем каждый параметр соответствующим образом (некоторые из них являются вызовами объектов, вызовами функций и т. Д.).Я открыт для разбора всего этого сразу, но подумал, что это будет просто сложнее.

Мое текущее регулярное выражение выглядит следующим образом:

\(?'pullsinglequotes'\'.+?\')|(?'pulldoublequotes'\".+?\")|(?'pullfunctions'[^,]\(([^()]|(?R))*\))\

Это МОЖНО работает, но имеет две проблемы:

  1. Пока не возвращает объекты (например, если я ссылаюсь на object.Field в качестве параметра).
  2. Включает только последнюю букву функции.

Вот REGEXR с проблемой: https://regexr.com/41e20

Я пробовал много разных вариантов REGEX, и у каждого есть свои недостатки.

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

Обновление Если кому-то интересно, это последнее мое регулярное выражение.

/(?'pullsinglequotes'\'.+?\')|(?'pulldoublequotes'\".+?\")|(?'pullfunctions'\b[\w.]+\s*\(([^()]|(?R))*\))|(?'pullvars'\w+(?:\.\w+)?)/

1 Ответ

0 голосов
/ 17 октября 2018

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

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

Полное регулярное выражение:

(?'pullsinglequotes'\'.+?\')|(?'pulldoublequotes'\".+?\")|(?'pullfunctions'\b[\w]+\s*\(([^()]|(?R))*\))|(?'pullvars'\w+(?:\.\w+)?)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...