2015-09-17 28 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

我正在考慮正則表達式,但不是正則表達式字符串來獲取所有值。我必須用正則表達式做更多。 –