Проверить, является ли строка математическим выражением или нет?
Я пытаюсь написать метод в 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