1

我有以下格式的输入字符串:

消息:id1:[label1:label2....:labelN]:id2:[label1:label2....:labelM]:id3:[label1:label2....:labelK]...

它基本上是与标签集相关联的 id。可以有任意数量的 id 和与这些 id 关联的标签。

我希望能够解析这个字符串并生成一个 id->labels 形式的 HashMap,以便稍后快速查找。

我想知道在 java 中解析此消息的最有效方法是什么?

4

3 回答 3

2

像这样的东西应该适合你:

String str = "Message:id1:[label1:label2:labelN]:id2:[label1:label2:labelM]:id3:[label1:label2:labelK]";
Pattern p = Pattern.compile("([^:]+):\\[([^\\]]+)\\]");
Matcher m = p.matcher(str.substring(8));
Map<String, List<String>> idmap = new HashMap<String, List<String>>(); 
while (m.find()) {
    List<String> l = new ArrayList<String>();
    String[] tok = m.group(2).split(":");
    for (String t: tok)
        l.add(t);
    idmap.put(m.group(1), l);
}
System.out.printf("IdMap %s%n", idmap);

现场演示:http: //ideone.com/EoieUt

于 2013-05-05T18:46:04.663 回答
1

考虑使用Guava 的 Multimap

如果你拿你给的字符串:

Message:id1:[label1:label2....:labelN]:id2:[label1:label2....:labelM]:id3:[label1:label2....:labelK]

并且做String.split("]"),你得到:

Message:id1:[label1:label2....:labelN
:id2:[label1:label2....:labelM
:id3:[label1:label2....:labelK

如果你循环遍历其中的每一个,在 上拆分[,你会得到:

Message:id1:     label1:label2....:labelN
:id2:            label1:label2....:labelM
:id3:            label1:label2....:labelK

然后,您可以id从.String[]StringMultimap

如果你不想使用 Guava,你也可以使用Map<String, List<String>>

于 2013-05-05T18:44:00.557 回答
0

以下代码将满足您的要求。

import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTest {

        public static void main(String[] args){
           String msg = "id1:[label1:label2]:id2:[label1:label2:label3]:id3:[label1:label2:label3:label4]";
           Pattern pattern = Pattern.compile("id");
            HashMap<String,String> kv = new HashMap<String,String>();
            Matcher m = pattern.matcher(msg);

            int prev = -1;
            int next = -1;
            int start = -1;
            int end = -1;

            String subMsg = "";
            while (m.find()){
                if(prev == -1){
                    prev = m.end();
                }
                else
                {
                    next = m.end();
                    start = prev;
                    end =   next;
                    subMsg = msg.substring(start,end);
                    kv.put(String.valueOf(subMsg.charAt(0)),subMsg.substring(subMsg.indexOf("["),subMsg.lastIndexOf("]")+1));
                    prev = next;
                }
            }
            subMsg = msg.substring(next);
            kv.put(String.valueOf(subMsg.charAt(0)),subMsg.substring(subMsg.indexOf("["),subMsg.lastIndexOf("]")+1));

            System.out.println(kv);
        }
}

输出:{3=[label1:label2:label3:label4], 2=[label1:label2:label3], 1=[label1:label2]}

现场演示:http: //ideone.com/HM7989

于 2013-05-05T19:49:33.753 回答