Проверить, является ли строка математическим выражением или нет?

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

ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
String foo = "1+2*10";
System.out.println(engine.eval(foo));

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

if(isExpression(foo))
{
engine.eval(foo);
}

Таким образом, я проверяю, математическое выражение или нет, прежде чем оценивать его. Есть ли простая реализация метода isExpression(foo)? Может быть, использовать какое-то регулярное выражение? Пожалуйста, дайте мне знать, если таковые имеются. Спасибо

5 ответов

Решение

Для таких действительно сложных операций, как эта, попытка определить, является ли она правильной формулой, почти такая же, как попытка действительно выполнить оценку.

Я рекомендую вам просто попытаться оценить и, в случае сбоя, сгенерировать исключение, специфичное для домена, сказать исключение CannotEvaluateFormulaException и отловить его.

Q: Есть ли встроенная функция Java для оценки этого 1+2*10 это выражение, и AB@C#! нет?

A: Нет.

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

ПРЕДЛОЖЕНИЕ:

Позвоните на ваш двигатель и поймайте любые исключения.

PS:

Вы должны делать это в любом случае, независимо от "правильного выражения / не выражения". Правильный?

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

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

Тем не менее, взгляните на Шаблон интерпретатора, чтобы оценить ваше выражение, если у вас нет более готового предложения, особенно если у вас есть простые нормальные математические выражения без пользовательских расширений / логики / чего-либо еще (см., Например, решение @user1264811!)

Тебе нужно попробовать и поймать.

обратитесь к обработке исключений

Возможно, вы захотите проверить это, если вы хотите сделать какой-нибудь калькулятор: users.cis.fiu.edu/~weiss/dsj2/code/Evaluator.java

Другие вопросы по тегам