2016-03-28 49 views
-2

如何用Java写的解析器以下字符串如何写解析器解析字符串中的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

我已经使用图案P = Pattern.compile尝试( “(\\ W +):(\\ W +)”);但不能正常工作,我需要 –

+4

我认为['([^#:] +):([^#] +)'](https://regex101.com/r/kL9iY8/2)应该足够了。或者用'#'分割,然后用':'分割每个块。 –

+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