2

サーバーから次の文字列を取得しますが、スペースで区切っているだけです。(改行は読みやすさによるものです。 "XXはプレースホルダーであり、長さを変えることができます。また、角かっこで囲まれたものの長さも変えることができます。

文字列1:

status:ok [XXX][a=XXX b=XXX c=XXX d=XXX e=0 f=XXX g=XXX h=XXX i=XXX j=XXX 
k=XXX l=XXX m=XXX n=[[XXX][XXX]] p=[[XXX][XXX][XXX][XXX][XXX][XXX][XXX]]]
end:end

文字列2:

status:ok [XXX][a=XXX b=XXX  c=XXX d=XXX d2=XXX e=XXX  f=XXX g=XXX h=XXX i=XXX j=XXX 
k=XXX l=XXX m=XXX n=[[XXX][XXX]] p=[[XXX][XXX][XXX][XXX][XXX][XXX][XXX]]]
end:end

角かっこ「[]」内のすべての部分には、多かれ少なかれ「[]」を含めることができます。内側の「[]」内の要素と単語の長さはさまざまです。HashMapにこれらのa、b、c、d、eなどが必要ですが、それを実行する前に、なんらかの方法で解析する必要があります。

Javaでこの文字列を効率的に解析するにはどうすればよいですか?

「正規表現解析」以外に「キー値解析」と呼ばれるものを提案しているウェブサイトやスレッドをたくさん検索して見つけましたが、残念ながら「キー値解析」に関する情報はまばらです。

編集:最後に、これらの値を次のようなハッシュマップに保存したいと思います。

HashMap<String,Object> myHashMap = new HashMap();
myHashMap.put(a, XXX);
....
myHashMap.put(p,array-of-all-[XXX]);
4

4 に答える 4

2

これを行うだけで、a、b、c ..が出力されます。

  String s ="status:ok [XXX][a=XXX b=XXX c=XXX d=XXX e=0 f=XXX g=XXX h=XXX i=XXX j=XXX k=XXX l=XXX m=XXX n=[[XXX][XXX]] p=[[XXX][XXX][XXX][XXX][XXX][XXX][XXX]]] end:end".replaceAll("end:end", "");

    String [] ss  = s.split("=");
    HashMap<Character,Object> myHashMap = new HashMap();
    try{
    for(int i=0;i<ss.length;i++){

        myHashMap.put(ss[i].charAt(ss[i].length()-1), ss[i+1].substring(0, ss[i+1].length()-1).trim());

    }

    }catch(Exception e){
        // do nothing
    }
      System.out.println(myHashMap);
    }
于 2012-11-24T16:52:03.883 に答える
0

正規表現を使用する代わりに、従来の文字列トークナイザーを使用するのはどうですか?

最近では、誰もがすべてを正規表現で壊そうとしています。Perl では、regexp が非常に簡略化された構文であったため、これは非常に理にかなっています。しかし、Java の場合、正規表現は少し扱いに​​くいです。

ただし、Java には、StringTokenizerなどの多くの便利なクラスが用意されています。推奨されないと考える人もいますが、多くの状況で非常に役立ちます。

もちろん、ファイル形式の解析に役立つさまざまなパッケージがあります。

たとえば、CUPは、Weka 機械学習ツールキットで使用されるパーサー ジェネレーターです。

JFlexは、古典的な C "flex" パーサー ジェネレーター (および Yacc、Bison など) に触発されている可能性があります。

優れたパーサーは、たとえばネストされた式を解析できます。a=[[1,2],[3,4]]などの表現が深く入れ子になっている場合でも、それを解釈する方法を知っています。正規表現ではそれができません。

正規表現に問題はありません。しかし、それらは照合用に設計されており、構文解析用には設計されていません。

于 2012-11-24T16:52:58.010 に答える
0

これは Regex-Parsing ではなく、少しキー値の解析ですが、主に一般的な解析です。
あなたはその話題を勉強するべきです。

文字列の問題は、式 [] に他の式 (ネストされた [[]]) を含めることができることです。
これは3行で解決できるものではありません。
式を解析する方法の説明を検索してみてください。
さらに、「文法」とは何かを理解する必要があります。次に、その式の文法を文字列に書き留め
ます。そうすれば、ほぼ文法に従って構文解析を実装できるため、作業の半分が完了します。

別の解決策: n および p (配列) では機能しない上記の回答のいずれかを使用します。そして 2 番目のステップでは、式 [[XXX][XXX][XXX][XXX][XXX][XXX]]」を解析しますが、これはそれほど難しくありません。(String.split("]")「[」が見つかるまで、文字列を使用して戻ることができます)。

于 2012-11-24T16:46:01.433 に答える
0

これは役に立ちますか

String str = "status:ok [XXX][a=XXX b=XXX c=XXX d=XXX e=0 f=XXX g=XXX h=XXX i=XXX j=XXX k=XXX l=XXX m=XXX n=[[XXX][XXX]] p=[[XXX][XXX][XXX][XXX][XXX][XXX][XXX]]] end:end";
String[] splitStrA = str.split(" ");         
HashMap<String,String> map = new HashMap() ;
for (String splitStr : splitStrA) {
    String[] splitStr1 = splitStr.split("=");
    if (splitStr1.length == 2) {
        map.put(splitStr1[0], splitStr1[1]);
    }
}
System.out.println(map);
于 2012-11-24T16:50:48.113 に答える