2012-03-13 45 views
4

我的影片格式像這樣的字符串:如何搜索鍵/值對的字符串在Java中

"key1=value1;key2=value2;key3=value3"

爲任意數字鍵/值對。

我需要檢查某個鍵是否存在(假設它被稱爲「specialkey」)。如果是這樣,我想要與它相關的價值。如果有多個「specialkey」設置,我只想要第一個。

現在,我正在尋找「specialkey」的索引。我從該索引開始取一個子字符串,然後查找第一個=字符的索引。然後我查找第一個;字符的索引。這兩個索引之間的子串給我與「specialkey」相關的值。

這不是一個優雅的解決方案,它真的困擾着我。尋找與「specialkey」相對應的價值的優雅方式是什麼?

回答

6

使用String.split

String[] kvPairs = "key1=value1;key2=value2;key3=value3".split(";"); 

這會給你一個數組kvPairs包含這些元素:

key1=value1 
key2=value2 
key3=value3 

遍歷這些,分裂他們,太:

for(String kvPair: kvPairs) { 
    String[] kv = kvPair.split("="); 
    String key = kv[0]; 
    String value = kv[1]; 

    // Now do with key whatever you want with key and value... 
    if(key.equals("specialkey")) { 
     // Do something with value if the key is "specialvalue"... 
    } 
} 
4

如果這只是你之後的一個關鍵,你可以使用正則表達式\bspecialkey=([^;]+)(;|$)和提取捕獲組1:

Pattern p = Pattern.compile("\\bspecialkey=([^;]+)(;|$)"); 
Matcher m = p.matcher("key1=value1;key2=value2;key3=value3"); 

if (m.find()) { 
    System.out.println(m.group(1)); 
} 

如果你正在做的與其他鍵的東西,然後拆分對;,然後在循環中= - 無需正則表達式。

+0

通知的string.split答案如何,不僅鈍,他們開始在你的輸入打破在複雜的苗頭(說你需要匹配多個鍵或者一個沒有特定子字符串的密鑰)。這也是維持或改變的噩夢,而這是一件輕而易舉的事情。 – sweaver2112 2012-03-13 02:45:36

0

正則表達式是非常適合的匹配,並在同一時間解析:

//c# 
string input = @"key1=value1;specialkey=scott;key3=value3"; 
var specialkey = Regex.Match(input, "specialkey=(.*?);").Groups[1].Value; 
Console.WriteLine(specialkey); 
6

我會解析字符串到地圖,然後就檢查關鍵:

String rawValues = "key1=value1;key2=value2;key3=value3"; 
Map<String,String> map = new HashMap<String,String>(); 
String[] entries = rawValues.split(";"); 
for (String entry : entries) { 
    String[] keyValue = entry.split("="); 
    map.put(keyValue[0],keyValue[1]); 
} 

if (map.containsKey("myKey") { 
    return map.get("myKey"); 
} 
1

以防萬一任何人都對純粹的基於正則表達式的方法感興趣,下面的表達式可以工作。但是,正如其他人之前所解釋的,String.split()建議任何一天這種任務。當有替代品使用時,您不應該使用正則表達式將您的生活複雜化。

Pattern pattern = Pattern.compile("([\\w]+)?=([\\w]+)?;?"); 
Matcher matcher = pattern.matcher("key1=value1;key2=value2;key3=value3"); 
while (matcher.find()) { 
    System.out.println("Key - " + matcher.group(1) + " Value - " + matcher.group(2); 
} 

輸出將被

Key - key1 Value - value1 
Key - key2 Value - value2 
Key - key3 Value - value3