Как отметил @davin, это не то, что вы можете проанализировать с помощью регулярного выражения.Однако вы можете разобрать это с помощью контекстно-свободной грамматики.Признание того, что вам нужен CFG, - это большой шаг, но переход от CFG к алгоритму синтаксического анализа может быть немного сложным.
Для анализа этого выражения я бы предложил использовать двухэтапный подход, очень похожий наподход, который вы найдете внутри компилятора.Во-первых, вам нужно маркировать строку в набор логических единиц.То есть вы бы конвертировали строку
(1 + 6) * 7
в список
["(", "1", "+", "6", ")", "*", "7"]
Есть много способов сделать этот шаг.Вы можете написать ручной токенизатор или использовать набор регулярных выражений для разделения строки.В этот момент вы можете обнаружить лексические ошибки , где вы сообщаете, есть ли в строке какое-либо содержимое, которого там быть не должно.Например, символ «,» не имеет никакого отношения к любому из этих выражений, и вы можете обнаружить это здесь.
После того, как вы разбили строку на токены, вам нужно будет parse поток токенов, чтобы убедиться, что он действителен и, необязательно, создать соответствующее внутреннее представление для математического выражения.Одним из наиболее известных (и самых простых) алгоритмов для этого является алгоритм Дейкстры-Шунтирования-Ярда , который вы можете легко написать за час.Если вы заинтересованы в более тяжелом классе алгоритмов для синтаксического анализа таких выражений, вам следует рассмотреть возможность создания генераторов синтаксического анализатора, которые способны обрабатывать более сложные выражения.Быстрый поиск включил этот генератор синтаксического анализатора LALR (1) для JavaScript , если вы хотите выполнить синтаксический анализ на стороне клиента.Если вы хотите выполнить синтаксический анализ на сервере, подумайте о том, чтобы взглянуть на инструменты bison или ANTLR, которые являются чрезвычайно мощными генераторами синтаксического анализа.
Надеюсь, это поможет!