используя регулярное выражение для математических выражений в java?

Я работаю над этим регулярным выражением

((([(]?[-]?[0-9]*[.]?[0-9]+)+([\/\+\-\*])+)+([0-9]*[.]?[0-9]+[)]?)+[\+\-\*\/]?([0-9]*)*)+

Мне нужно это, чтобы принять любое выражение, например: (2+2*7)-4+2/(5-3)+2
, и я хочу избежать таких выражений, как: (2+3)- or 2+2-(2+3

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


person Arash Parnia    schedule 19.10.2013    source источник
comment
Математическая запись в основном представляет собой контекстно-свободную грамматику, которую (не невозможно, но) чрезвычайно сложно реализовать с помощью регулярных выражений. Почему бы вам просто не выдать ошибку, если токены не совпадают с продукцией?   -  person Qantas 94 Heavy    schedule 19.10.2013
comment
Не используйте для этого регулярное выражение. Используйте Дерево выражений   -  person Anirudha    schedule 19.10.2013
comment
Итак, вы хотите проверить правильность количества разделителей ( )?   -  person hwnd    schedule 19.10.2013
comment
@Qantas94Тяжёлый Что? Это невозможно!   -  person Guido    schedule 21.12.2013


Ответы (1)


В самом общем виде регулярные выражения могут описывать обычные языки. С другой стороны, математические формулы обычно оформляются как контекстно-свободные языки, которые являются надмножество обычных языков. иерархия Хомского делает это различие четким: обычные языки относятся к типу 3, а контекстно-свободные языки относятся к более общему типу 2.

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

Возможно, вы захотите изучить разницу между лексером и парсер. Обычно вы используете первое с регулярными выражениями для токенизации ваших потоков в числа, операторы и тому подобное, а второе — для создания и проверки выражений, составленных из этих токенов.

person MvG    schedule 21.10.2013