web-dev-qa-db-ja.com

文字列を条件として評価するJava

D/Bから一連の列値を取得し、それを条件として確認する必要があります。

たとえば、D/B列に"value > 2""4 < value < 6"のような文字列があります。 (値は常に比較される値です)。コードで変数値を宣言し、この条件を評価する必要があります。

int value = getValue();
if (value > 2)  //(the string retrieved from the D/B)
  doSomething();

これどうやってするの??どんな助けでも大歓迎です。ありがとう。

標準(Java 1.6以降)のスクリプトライブラリを使用した例を次に示します。

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class Test {

    public static void main(String[] args) throws Exception {
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("JavaScript");

        engine.eval("value = 10");
        Boolean greaterThan5 = (Boolean) engine.eval("value > 5");
        Boolean lessThan5 = (Boolean) engine.eval("value < 5");

        System.out.println("10 > 5? " + greaterThan5); // true
        System.out.println("10 < 5? " + lessThan5); // false
    }
}
33
assylias

些細なことではありません。データベースで使用される式言語のパーサーが必要です。それが標準的で明確に指定された言語である場合、インターネットで見つけることができるかもしれませんが、それが社内のものである場合は、独自に作成する必要があるかもしれません(おそらくANTLRのようなパーサジェネレータを使用して)。

javax.script パッケージには、Javascriptインタープリターなどの外部スクリプトエンジンを統合するためのツールがいくつか含まれています。別のアイデアは、スクリプトエンジンを導入し、それに式をフィードすることです。

基本的に、スクリプト式を評価しています。その式で許可されているものに応じて、非常に単純なもの(グループを識別する正規表現)または非常に複雑なもの(javascriptエンジンを埋め込む?)を回避できます。

式が次のような単純なケースを見ていると仮定します。[boundary0] [operator] "value" [operator] [boundary1]

[境界] [演算子]グループの両方ではなく、一方が省略される場合があります。 (両方が存在する場合、演算子は同じである必要があります)

グループをキャプチャする場合は、正規表現を使用します。

次のようなもの:(?:(\ d +)\ s *([<>])\ s *)?value(?:\ s *([<>])\ s *(\ d +))?

そして:boundary1 = group(1); operator1 = group(2); operator2 = group(3); border2 = group(4)

1
ptyx

Java(Java 7)の最新バージョンでは、文字列でのSwitch Caseステートメントが許可されています。可能なバリエーションが多くない場合は、これまたは同様のことを行うことができます。

int value = getValue();
switch(myString) {
  case "value > 2" : if (value > 2) {  doSomething();} break;
  case "4 < value < 6" : if (value > 4 && value < 6) {  doSomethingElse();} break;
  default : doDefault();
}
0
NimChimpsky

Ifステートメント内の文字列を次のように解析してみてください。

if(parseMyString(getValue()))
    doSomething();

ParseMyStringでは、条件について何を評価する必要があるかを判断できます。パーサーの作成方法がわからない場合は、以下を参照してください。 http://www.javapractices.com/topic/TopicAction.do?Id=87

0
AGE

最大限の柔軟性で条件を評価するには、埋め込み用に設計されたスクリプト言語を使用します。たとえば、 [〜#〜] mvel [〜#〜] は、質問のような単純な条件式を解析および評価できます。

MVELを使用すると、Java 1.6+(特にJavaScript)でスクリプトエンジンを使用するよりも大きな利点が1つあります。MVELを使用すると、コンパイルできます。スクリプトをバイトコードに変換し、実行時の評価をはるかに効率的にします。

0
Óscar López

これはあなたの質問自体には答えません。同じ結果に影響を与える可能性のある代替ソリューションを提供します。

条件を定義する擬似コードを含む単一のデータベース列を格納する代わりに、スキーマが満たす必要のある条件のタイプとそれらの条件の値を定義するテーブルを作成します。これにより、これらの条件のプログラムによる評価が簡単になりますが、評価する条件の種類が異なる場合は複雑になる可能性があります。

たとえば、次のようなテーブルがあるとします。

CONDITION_ID | MINIMUM | MAXIMUM | IS_PRIME  |   ETC.
______________________________________________________
      1      |    2    |   NULL  |   NULL    |   ...
      2      |    4    |    6    |   NULL    |   ...

これらの行エントリは、それぞれルールvalue > 2および6 > value > 4にマップされます。

これにより、提供するアプローチに比べて多くの利点がもたらされます。

  • パフォーマンスと清潔さの向上
  • 条件はデータベースレベルで評価でき、クエリのフィルタリングに使用できます
  • 擬似コード構文が壊れているシナリオの処理について心配する必要はありません
0
cheeken