「数学/代数式」を表す入力文字列から変数を抽出する正規表現/メソッドと、変数にもなり得るこの「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