如何在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+)");
,但没有完全符合我的需要。
答案 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