2

文字列を引数として受け入れるメソッドを 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) の簡単な実装はありますか? 正規表現を使用している可能性がありますか?ありましたら教えてください。ありがとう

4

5 に答える 5

7

このような非常に複雑な操作の場合、それが有効な式であるかどうかを確認する作業は、実際に評価を行う作業とほぼ同じです。

評価を試み、失敗した場合はドメイン固有の例外 (CannotEvaluateFormulaException など) をスローしてキャッチすることをお勧めします。

于 2012-06-22T16:23:58.083 に答える
4

1+2*10Q:式であるかどうかを評価する組み込みの Java 関数AB@C#!はありますか?

A:いいえ。

正規表現を使用すると近づくかもしれませんが、それが本当に算術式であるかどうかを判断するには、誰かが文字列を解析して評価する必要があります。

提案:

エンジンを呼び出し、例外をキャッチします。

PS:

とにかく、「有効な式/式ではない」とは関係なく、それを行う必要があります。正しい?

于 2012-06-22T16:24:55.250 に答える
3

これをチェックする正規表現を書くことはおそらく可能ですが、非常に長く複雑なものになるでしょう。あなたが通常行うことは、おそらく再帰的に解析することであり、式の一部のサブパートの奥深くで何かが適合しない場合、例外をスローします。

例外をキャッチする限り、例外をスローするのは恥ではありません。それがその目的です。もちろん、例外のスローとキャッチにはいくらかのオーバーヘッドがありますが、正しいかどうかにかかわらず、すべての式に対して実行される最初の事前チェックに対してそれを評価する必要があります。

とはいえ、特にカスタム拡張機能/ロジック/その他のない単純な通常の数式がある場合は、式を評価するためにインタープリター パターンを見てください (たとえば、@ user1264811 ソリューションを確認してください)。 !)

于 2012-06-22T16:23:52.553 に答える
2

試してキャッチする必要があります。

例外処理を参照

于 2012-06-22T16:24:47.090 に答える
1

ある種の電卓を作成したい場合は、こちらを確認してください: users.cis.fiu.edu/~weiss/dsj2/code/Evaluator.java

于 2012-06-22T16:23:48.683 に答える