2015-09-17 31 views
1

我有一个这样的字符串的字符串:解析可变键值对

*********** name: NOTINSTATE timestamp: 2015-09-16T12:33:01.253Z 
MyKeyValue1 = myData MyKeyValue2 = 0.0 based on filter: no Filter 
******************************** 

在这个字符串我有KeyValuePairs:

"name" NOTINSTATE 
"timestamp" 2015-09-16T12:33:01.253Z 
"MyKeyValue1" myData 
"MyKeyValue2" 0.0 
"based on filter" no Filter 

我在想反向的方式类似的Freemarker但我不认为Freemarker的其他功能。

我知道我可以做到这一点肮脏的方式和模式和拆分字符串,但必须有更好的方式来做到这一点。

任何有用的建议或框架? 我的searchString本身不会在将来改变。它将永远是一样的。

+0

这些值显然是可变的,但是键是变量吗?他们全部? – Andreas

+0

不用钥匙总是一样的。 –

+0

我想到了使用一些正则表达式,我可以说出两种模式之间的关系以获得我的价值。但我将不得不这样做非常有价值。这将是肮脏的方式。 –

回答

2

正则表达式是您的朋友:

String input = "*********** name: NOTINSTATE timestamp: 2015-09-16T12:33:01.253Z\n" + 
       "MyKeyValue1 = myData MyKeyValue2 = 0.0 based on filter: no Filter\n" + 
       "********************************"; 
String regex = "\\*+\\s+" + 
       "(name):\\s+(.*?)\\s+" + 
       "(timestamp):\\s+(.*?)\\s*[\r\n]+" + 
       "(MyKeyValue1)\\s+=\\s+([^=]*)\\s+" + 
       "(MyKeyValue2)\\s+=\\s+([^=]*)\\s+" + 
       "(based on filter):\\s+(.*?)\\s*[\r\n]+" + 
       "\\*+"; 
Matcher m = Pattern.compile(regex).matcher(input); 
if (m.matches()) { 
    Map<String, String> pairs = new LinkedHashMap<>(); 
    for (int i = 1; i <= 10; i += 2) 
     pairs.put(m.group(i), m.group(i + 1)); 

    // print for testing 
    for (Entry<String, String> entry : pairs.entrySet()) 
     System.out.printf("\"%s\" %s%n", entry.getKey(), entry.getValue()); 
} 

输出正是你表明:

"name" NOTINSTATE 
"timestamp" 2015-09-16T12:33:01.253Z 
"MyKeyValue1" myData 
"MyKeyValue2" 0.0 
"based on filter" no Filter 

更新

上述正则表达式是宽松的空间,但严格上关键名称。你可以对空格和宽松的关键名称或任何其他组合严格:

String regex = "\\*+ " + 
       "(\\w+): (.+?) " + 
       "(\\w+): (.+?)[\r\n]+" + 
       "(\\w+) = ([^=]+?) " + 
       "(\\w+) = ([^=]+?) " + 
       "([^:]+): (.+?)[\r\n]+" + 
       "\\*+"; 
+0

我正在考虑正则表达式,但不是正则表达式字符串来获取所有值。我必须用正则表达式做更多。 –