Мне нужен небольшой синтаксический анализатор в моем приложении javascript для захвата ввода пользователя и его выполнения.
Выражения будут простыми именами переменных, числами или арифметическими c операторами для захвата выражений типа "(недели *) 2) + (3 * days) "* 1003 *
Я планирую сначала преобразовать все имена переменных в строке в числа, а затем использовать оконную функцию для вычисления выражения Numberri c.
Для этого мне нужно вытащить все имена переменных и заменить их числами.
Попытка написать регулярное выражение, которое извлекает имена переменных, которые я придумала:
(?:\s\/+\-\*\()?([A-Za-z_]+[A-Za-z_0-9]*)(?:\s\+\-\/\*\))?
который ищет строки с именами переменных, окруженные арифметическими c операторами, паренами или пробелами, но избегает захвата любых вызовов функций.
Однако, когда я запускаю эту тестовую строку в regextester.com
a+3+cats+dogs(32)*(cats+dogs)+ x[horse_3]
, я получаю такой результат:
![this result](https://i.stack.imgur.com/AN2X7.png)
, что является прогрессом, но я не понимаю, почему «собаки» в dogs(32)
захватываются, поскольку за «собаками» не следует оператор, пробел или близкий друг, и почему horse_3
и x
захвачены, так как они тоже не подходят? (скобка не указана как разрешенный символ для следования или предшествования ..]
Как я могу исправить это регулярное выражение, чтобы оно захватывало только имена, которым предшествует ничто (начало строки), оператор пробел или открытая скобка , а затем следует тот же список, за исключением только закрытых парен не открытых парен?