我有以下格式的输入字符串:
消息:id1:[label1:label2....:labelN]:id2:[label1:label2....:labelM]:id3:[label1:label2....:labelK]...
它基本上是与标签集相关联的 id。可以有任意数量的 id 和与这些 id 关联的标签。
我希望能够解析这个字符串并生成一个 id->labels 形式的 HashMap,以便稍后快速查找。
我想知道在 java 中解析此消息的最有效方法是什么?
像这样的东西应该适合你:
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);
如果你拿你给的字符串:
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[]
String
Multimap
如果你不想使用 Guava,你也可以使用Map<String, List<String>>
以下代码将满足您的要求。
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