Столкнулся с этой проблемой, и я искал несколько дней.Я использую 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))*\))\
Это МОЖНО работает, но имеет две проблемы:
- Пока не возвращает объекты (например, если я ссылаюсь на object.Field в качестве параметра).
- Включает только последнюю букву функции.
Вот REGEXR с проблемой: https://regexr.com/41e20
Я пробовал много разных вариантов REGEX, и у каждого есть свои недостатки.
Мой вопрос:У кого-нибудь достаточно знаний о регулярных выражениях, чтобы решить эти две проблемы?Если это так, любая помощь будет принята с благодарностью.
Обновление Если кому-то интересно, это последнее мое регулярное выражение.
/(?'pullsinglequotes'\'.+?\')|(?'pulldoublequotes'\".+?\")|(?'pullfunctions'\b[\w.]+\s*\(([^()]|(?R))*\))|(?'pullvars'\w+(?:\.\w+)?)/