Как искать строку пар ключ/значение в Java

у меня есть строка, которая имеет формат такой:

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

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

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

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

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

5 ответов


использовать строку.сплит:

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"...
   }
}

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

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");
}

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

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


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

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() рекомендуется любой день для такого рода задач. Вы не должны усложнять свою жизнь, пытаясь использовать регулярное выражение, когда есть альтернатива.


регулярное выражение хорошо подходит для сопоставления и разбора одновременно:

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