2017-07-08 33 views
0

私は数式を解析し、使用されたすべての変数を取得する必要があります。変数のリストが利用可能です。例えば、式は次のようになります。部分文字列のパターンによる文字列の解析

String f = "(Min(trees, round(Apples1+Pears1,1)==1&&universe==big)*number"; 

私は可能変数があることを知っている:私はその分割方法を信じて

String[] varsInF = {"trees", "Apples1","Pears1", "universe", "big","number"}; 

String[] vars = {"trees","rivers","Apples1","Pears1","Apricots2","universe","galaxy","big","number"}; 

私は、次の配列を取得する必要がありますここで良いですが、これに必要な正規表現を理解することはできません。

+0

式の変数の定義は何ですか?私はそれを目の当たりにする以外に、どのように伝えることができますか? 'Min'は一つではなく、' 1'でもない。 –

+0

"vars"配列に含まれていれば、それは変数である。 – DKSD

+0

問題文は実際には、 "定義済みのリストに基づいて文字列内に存在するすべてのトークンを見つける"です。正規表現はこの問題の間違ったツールです。 –

答えて

1

任意の正規表現パターンは必要ない - ただ与えられた文字列に含まれているサポートvarsのどの項目をチェック:あなたができるStream<>を使用し

List<String> varsInf = new ArrayList<>(); 
for(String var : vars) 
    if(f.contains(var)) 
     varsInf.add(var); 

String[] varsInf = Arrays.stream(vars).filter(f::contains).toArray(String[]::new); 
+0

ありがとうございます! ArrayListは私にとってここで完璧です。 – DKSD

+1

'vars = {" verse "、" universe "、...}'はどうですか? –

0

は、「変数」を想定するとは、 1つの英数字または複数のそのような文字の連続したシーケンスで表される場合、英数字以外の文字で分割する必要があります。 e。 [^\w]+を入力し、結果を反復またはフィルターで集計します。

Set<String> varSet = new HashSet<>(Arrays.asList(vars)); 
List<String> result = new ArrayList<>();  
for (String s : f.split("[^\\w]+")) { 
    if (varSet.contains(s)) { 
     result.add(s); 
    } 
} 
関連する問題