2017-04-05 6 views
-1

私のようなJavaで文字列をしている:Javaでregexを使用してグラフ括弧内のキー/値を取り込む方法は?

String whatIHaveToMatch = "$item1$={key1=1,key2=2,key3=3,}"+ 
          "$item2$={key10=4,key11=5,key3=4,key9=7,}"+ 
          "$itemN$={keyi-1=5,keyi=3,}"; 

は、どのように私はそれらの各項目と関連したすべてのキー/値が含まれているすべてのグループを取得するパターンを定義することができますか?

UPDATE:

私は外部のHashMapのすべてのentryKeyは、アイテムの識別子であり、内部の「キー」/「値」の地図を返すにHashMap<String,HashMap<String,Integer>> を構築する必要があります。

「キー」(この例では:key1、key2、key3 ...)は特定のフォームを持っていませんが、そのような英数字にすることができます。

+0

どのような種類のJavaオブジェクトを出力しますか? – horcrux

+0

HashMap > –

+0

与えられた入力に対して期待される出力を追加できますか?また、あなたの弦はいつもこれのようになりますか? (すべてのキーは「キー」と数字で始まります) – jrook

答えて

1

これは、正規表現で仕事をしていません:

String string = "$item1$={key1=1,key2=2,key3=3,}"+ 
        "$item2$={key10=4,key11=5,key3=4,key9=7,}"+ 
        "$itemN$={keyi-1=5,keyi=3,}"; 
HashMap<String,HashMap<String,Integer>> myMap = new HashMap<String,HashMap<String,Integer>>(); 
Pattern itemPattern = Pattern.compile("([^\\s{}]+)=\\{([^{}]+)\\}"); 
Matcher itemMatcher = itemPattern.matcher(string); 
while(itemMatcher.find()) { 
    HashMap<String,Integer> item = new HashMap<String,Integer>(); 
    String itemName = itemMatcher.group(1); 
    String itemContent = itemMatcher.group(2); 
    Pattern kvPattern = Pattern.compile("([^=,]+)=([^=,]+)"); 
    Matcher kvMatcher = kvPattern.matcher(itemContent); 
    while(kvMatcher.find()) { 
     item.put(kvMatcher.group(1), Integer.parseInt(kvMatcher.group(2))); 
    } 
    myMap.put(itemName, item); 
} 
System.out.println(myMap.toString()); 

しかし、非常に注意してください。キンバートが述べたように、正規表現はこの種の作業のための正しいツールではありません。

+0

あなたはそうです!それは動作します!うん!ありがとう! –

1

これに対して正規表現は間違ったツールです。あなたは単純なパーサーが必要です。 これが解析する唯一のデータ形式であれば、文字列を解析するためのカスタムコードを書くことができます。ある範囲のフォーマットを解析する必要があるなら、JavaCCやAntlrのようなものが良いでしょう。

関連する問題