2

「数学/代数式」を表す入力文字列から変数を抽出する正規表現/メソッドと、変数にもな​​り得るこの「PROPERTY(AnyOtherAplhaNumeric)」のような特別なパターンを作成しようとしています。

変数の私の定義:

1) 英数字の値のみを含めることができます

2) 少なくとも 1 文字以上である必要があります

3) 数字で始めることはできません。[A-Za-z] で始める必要があります

4) たとえば「X」などの変数は、この文字列「PROPERTY(X)」で囲むことができるため、変数は「PROPERTY(X)」になります。</p>

私の現在のメソッドと正規表現(一部のケースでのみ機能します):

public Set<String> extractUniqueVarsFromExpression(String expression) {
        Set<String> varsSet = null;
        Pattern p = null;
        Matcher m = null;
        System.out.println(expression);
        if (expression != null) {
            varsSet = new java.util.LinkedHashSet<String>();
            //"[A-Za-zPROPERTY(?)_][A-Za-z0-9PROPERTY(?)_]*||[A-Za-z_][A-Za-z0-9_]*"
            //"[[A-Za-z_][A-Za-z0-9_]*"
            p = Pattern.compile("[A-Za-zPROPERTY(?)_][A-Za-z0-9PROPERTY(?)_]*||[A-Za-z_][A-Za-z0-9_]*",
                    Pattern.CASE_INSENSITIVE);
            m = p.matcher(expression);
            while (m.find()) {

                    String group = m.group().trim();
                //do not add duplicates     

                         if (!varsSet.contains(group)) 
                         {
                    varsSet.add(group);

                    System.out.println(" Variable : " + group);
                         }//end if not duplicate 

            }// end while

        }
        System.out.println();
        return varsSet;
    }

例/ケース:

例 1:

入力: [(ibdweight / ibdheight) * ibdheight] * 703

出力:

変数 : PROPERTY(ibdweight)

変数 : PROPERTY(ibdheight)

例 2:

入力: [ibdweight / ibdheight * ibdheight] * 703

出力:

変数 : ibdweight

変数 : ibdheight

例 3:

入力: [PROPERTY(ibdweight) / [PROPERTY(ibdheight) * PROPERTY(ibdheight)] * 703

出力:

変数 : PROPERTY(ibdweight)

変数 : PROPERTY(ibdheight)

例 #:4

これらはうまくいかないケースです (例 4 から 6):

問題は、括弧が変数として選択されていることです:

入力: ( 質量 * ( 加速度 + 何でも))

出力:

変数 : (

変数 : 質量

変数 : 加速度

変数 : なんでも

変数 : ))

例 #:5

問題は、括弧が変数として選択されていることです:

入力: ( ベース * 高さ ) / 2

出力:

変数 : (

変数 : ベース

変数 : 高さ

変数 : )

例 #:6

問題は、括弧が変数として取得されているか、変数に添付されていることです。

入力: [((( var * var2 ) var3 ) + ( var1 / var4 ) var5) / var6 ]

出力:

変数 : (((

変数 : var

変数:var2

変数 : )

変数:var3

変数 : (

変数:var1

変数 : var4

変数 : var5)

変数 : var6

4

2 に答える 2

4

正規表現の問題は、括弧と括弧内に「PROPERTY」という単語の両方があることです。角かっこは、文字列ではなく、任意のメンバーが一致する文字のセットを指定するためのものです。

あなたのために働くはずの単純な(おそらく最適ではない)バリエーションは次のとおりです。
(PROPERTY\([A-Za-z][A-Za-z0-9_]*\))|([A-Za-z][A-Za-z0-9_]*)

わずかに優れたバージョンは次のようになります。
(PROPERTY\([A-Za-z]\w*\))|([A-Za-z]\w*)

于 2012-06-28T20:27:05.960 に答える
0

問題の一部は、正規表現についての考え方です。

例として:

    [A-Za-zPROPERTY(?)_]

これは基本的に、期待どおりに動作しない「文字クラス」です。クラス内の任意の文字に一致する入力文字列内の任意の 1 文字に一致します。PROPERTY を単一のエンティティとして扱うのではなく、別々の大文字として扱います (とにかく、AZ に既に含まれています。また、文字クラスに (?) があると、"(" と一致します。あなたがしたい。

于 2012-06-28T20:26:02.967 に答える