2016-05-24 4 views
0

私はので、私はカンマ,に分割し、キーと0その値としてcossnをロードする必要が(Map<String, String>)key=valueとしてマップにそれをロードする必要key1=value1, key2=value2のフォーマットである文字列の下に持っています。区切り文字で文字列を解析し、マップにロードしますか?

String payload = "cossn=0, abc=hello/=world, Agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"; 

HashMap<String, String> holder = new HashMap(); 
String[] keyVals = payload.split(", "); 
for(String keyVal:keyVals) { 
    String[] parts = keyVal.split("=",2); 
    holder.put(parts[0], parts[1]); 
} 

私はこのラインholder.put(parts[0], parts[1]);java.lang.ArrayIndexOutOfBoundsExceptionを取得していますし、それは価値KHTML, like Geckoに余分なコンマを持っているので、それがこのString Agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36のbcoz起こっています。

どうすればこの問題を解決できますか?一般的に、以下は私のキーと値が地図にロードされた後でなければなりません。

Key   Value 
cossn  0 
abc   hello/=world 
Agent  Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36 
+0

いつも4つのカンマがありますか? – UDKOX

+0

これは単なるサンプル文字列です。一般に、それは非常に長い文字列であり、コンテンツはほとんどの場合変更されます。 – user1950349

+0

入力のフォーマットを定義することはできますか?これは固定ですか? – Vampire

答えて

4

あなたはあなたの鍵が唯一の英数字が含まれて言ったように、以下はおそらく分割のための良好なヒューリスティック次のようになります。

payload.split("\\s*,\\s*(?=[a-zA-Z0-9_]+\\s*=|$)"); 

の終わりが続いている、おそらく空白フレームカンマを上分割します文字列または英数字キー、オプションの空白および等号を含む。

0

あなたはペイロードを制御することはできませんことを考えると、あなたは「違法カンマは」あなた「」正規表現と一致しない作るために何かをする必要があります。

ヴァンパイアは素晴らしい正規表現を提供しました。私はすでに手作業による解析の道を切り開いてきたので、以下では正規表現以外のソリューションを提供します。

別の解決方法は、文字を繰り返し入力して部分文字列を保存することによって、手動で解析/分割点を見つけることです。そのコンマスペースで分割するかどうかを決定するために、「次の等号」に到達するまで「最後のカンマスペース」を追跡します。

ここに私が説明しようとしていることを示すコードがあります。

import java.util.Arrays; 

public class ParseTest { 

    static String payload = "cossn=0, abc=hello/=world, Agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"; 

    public static void main(String[] args) { 
     int lastCommaSpace = -2; 
     int beginIndex = 0; 

     // Iterate over string 
     // We are looking for comma-space pairs so we stop one short of end of 
     // string 
     for (int i = 0; i < payload.length() - 1; i++) { 
      if (payload.charAt(i) == ',' && payload.charAt(i + 1) == ' ') { 
       // This is the point we want to split at 
       lastCommaSpace = i; 
      } 
      if (payload.charAt(i) == '=' && lastCommaSpace != beginIndex - 2) { 
       // We've found the next equals, split at the last comma we saw 
       String pairToSplit = payload.substring(beginIndex, lastCommaSpace); 
       System.out.println("Split and add this pair:" + Arrays.toString(pairToSplit.split("=", 2))); 
       beginIndex = lastCommaSpace + 2; 
      } 
     } 
     // We got to the end, split the last one 
     String pairToSplit = payload.substring(beginIndex, payload.length()); 
     System.out.println("Split and add this pair:" + Arrays.toString(pairToSplit.split("=", 2))); 
    } 

} 
関連する問題