Как искать строку пар ключ / значение в Java - PullRequest
6 голосов
/ 13 марта 2012

У меня есть строка, отформатированная так:

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

для любого количества пар ключ / значение.

Мне нужно проверить, что определенный ключсуществует (скажем, это называется «specialkey»).Если это так, я хочу значение, связанное с ним.Если есть несколько наборов «specialkey», мне нужен только первый.

Сейчас я ищу индекс «specialkey».Я беру подстроку, начинающуюся с этого индекса, затем ищу индекс первого = символа.Затем я ищу индекс первого ; символа.Подстрока между этими двумя индексами дает мне значение, связанное с «specialkey».

Это не элегантное решение, и оно действительно беспокоит меня.Какой элегантный способ найти значение, которое соответствует «specialkey»?

Ответы [ 5 ]

10 голосов
/ 13 марта 2012

Я бы проанализировал строку на карте, а затем просто проверил ключ:

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");
}
8 голосов
/ 13 марта 2012

Использование 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"...
   }
}
5 голосов
/ 13 марта 2012

Если вам нужен только один ключ, вы можете использовать регулярное выражение \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));
}

Если вы что-то делаете с другими ключами, то разбейте на ;, а затем = в цикле - нет необходимости в регулярном выражении.

2 голосов
/ 14 июня 2015

На всякий случай, если кто-то заинтересован в подходе, основанном исключительно на регулярных выражениях, работает следующий фрагмент:

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

Однако, как уже объяснялось ранее,String.split() рекомендуется в любой день для такого рода задач.Вы не должны усложнять свою жизнь, пытаясь использовать Regex, когда есть альтернатива.

0 голосов
/ 13 марта 2012

Regex хорошо подходит для сопоставления и анализа одновременно:

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