如何编写解析器来解析java中的字符串

时间:2016-03-28 15:50:49

标签: java regex string-parsing

如何在java中为下面的字符串编写解析器

"SiteId:BLR232#Latitude:12.918444#Longitude:77.5940136#NetworkType:4g#Type:NONE#Type of Complaint:Call Drop#Sample Number:7022979575#Problem Description:agshjs vshsijsb#"

以便结果输出将在hashmap java

Key = SiteId, Value = BLR232
Key = Type, Value = NONE
Key = Problem Description, Value = agshjs vshsijsb
Key = Sample Number, Value = 7022979575
Key = NetworkType, Value = 4g
Key = Latitude, Value = 12.918444
Key = Type of Complaint, Value = Call Drop
Key = Longitude, Value = 77.5940136

我曾尝试使用Pattern p = Pattern.compile("(\\w+):(\\w+)");,但没有完全符合我的需要。

1 个答案:

答案 0 :(得分:2)

您的(\w+):(\w+)仅匹配:之前和之后的单个字词。您有#作为记录分隔符,:作为键值分隔符,因此您不能仅依赖\w类。

请注意,只需将带有#的字符串拆分为键值对,然后将每个键值对与:分开即可解决问题:

String str = "SiteId:BLR232#Latitude:12.918444#Longitude:77.5940136#NetworkType:4g#Type:NONE#Type of Complaint:Call Drop#Sample Number:7022979575#Problem Description:agshjs vshsijsb#";
String[] kvps = str.split("#");
Map<String, String> res = new HashMap<String, String>();
for(String kvp : kvps) {
    String[] parts = kvp.split(":");
    res.put(parts[0], parts[1]);
    System.out.println(parts[0] + " - " + parts[1]); // just demo
}

请参阅IDEONE demo

如果您需要一个正则表达式,可以使用Matcher#find()的以下模式:

([^#:]+):([^#]+)

说明:

  • ([^#:]+) - 除#:以外的1个以上字符(因此,我们保留在键值对内并匹配密钥)
  • : - 字面冒号
  • ([^#]+) - #以外的1个字符(因此,我们将该值与#匹配。

请参阅regex demo