Понятие «регулярный» синтаксис является академическим понятием. «Регулярные выражения» имеют правильные имена: они могут анализировать любой «обычный» синтаксис, но их нельзя использовать для анализа нерегулярного синтаксиса.
Давайте определим «базовую математику» как сочетание чисел, 4 операторов: +-*/
и скобок.
«основные математические» - это не регулярно .
Поэтому его нельзя анализировать с помощью регулярных выражений.
То, что вы хотите, это парсер, который может превратить это:
a+x*y+(b-c)*e
в эту структуру данных:
PLUS
/ \
PLUS TIMES
/ \ / \
a TIMES MINUS e
/ \ / \
x y b c
Могут использоваться различные технологии синтаксического анализа, такие как рекурсивный спуск или пакетирование (например, с использованием библиотеки анализатора граппа / пропаренный), а также различные технологии синтаксического анализа на основе LALR и LL (k), такие как ANTLR. Обычно это очень сложные технологии; возможно, для чего-то такого тривиального вы можете написать для этого собственный анализ на основе рекурсивного спуска.
Но, возвращаясь к исходному вопросу, если вы хотите разделить a+x*y+(b-(g+h))*e
на: ['a', 'x', 'y', '(b- (g + h))', 'e '], что является лишь частью того, что вам нужно, поскольку теперь вам все еще нужно разобраться, что делать с узлом' (b- (g + h)) ', регулярное выражение просто не может этого сделать: вы хотите, чтобы ваше регулярное выражение см. открытие (
прямо перед b
в качестве начала блока скобок, а затем ... вашему регулярному выражению нужно СЧИТАТЬ количество открывающих паренов, а затем найти столько закрывающих паренсов и проигнорировать их, а затем закрывающий член после тех, кто побеждает. Итак, это регулярное выражение:
String elementPattern = "(\\([^\\)]+\\)|[^-+*/\\(\\)]+)";
Pattern p = Pattern.compile("^\\s*" + elementPattern + "(\\s*[-+*/]\\s*" + elementPattern + ")*$");
, который на первый взгляд, кажется, выполняет работу, на самом деле не может выполнить эту работу: он перестал бы рассматривать часть (b-(g+h))
в FIRST из 2 закрывающих паренов и, таким образом, не соответствовал , Необходимо остановиться на втором, но регулярные выражения не имеют никакого способа сделать это, потому что это не «регулярный».