如何从管道分隔的键/值列表中检索值?

时间:2014-08-18 18:04:17

标签: java regex

我有一个字符串:

String s = "a=xxx|b = yyy|c= zzz"

我正在尝试编写一个返回与给定键对应的值的函数,但它不能按预期工作(它返回一个空字符串):

static String getValueFromKey(String s, String key) {
  return s.replaceAll(key + "\\s*=\\s*(.*?)(\\|)?.*", "$1");
}

测试:

static void test() {
  String s = "a=xxx|b = yyy|c= zzz";
  assertEquals(getValueFromKey(s, "a"), "xxx");
  assertEquals(getValueFromKey(s, "b"), "yyy");
  assertEquals(getValueFromKey(s, "c"), "zzz");
}

我需要通过测试的正则表达式是什么?

5 个答案:

答案 0 :(得分:2)

如果你有这些字符串,你可以使用这样的简单正则表达式:

X\s*=\s*(\w*)

<强> Working demo

enter image description here

正如 Michelle 在他的评论中所指出的,如果您将苹果和菠萝作为键,那么您可以使用字边界来避免遇到麻烦:

\bapple\b\s*=\s*(\w*)

<强> Working demo

enter image description here

答案 1 :(得分:2)

您可以将此正则表达式用于匹配

\W*(\w+)\W*=\W*([^|]*)

RegExDemo

<强>代码:

static void test() {
      String s = "a=xxx|b = yyy|c= zzz";
      Pattern pattern = Pattern.compile("\\W*(\\w+)\\W*=\\W*([^|]*)");
      Matcher matcher = pattern.matcher(s);

      while (matcher.find()) {
          System.out.println(matcher.group(1) + " :: " + matcher.group(2));
      }
    }
}

<强>输出:

a :: xxx
b :: yyy
c :: zzz

答案 2 :(得分:2)

根据问题,您似乎只想更改正则表达式并保持相同的代码结构。因此,您必须确保正则表达式匹配完整模式,否则该字符串仍将包含其他数据。因此,即使有更好的方法来实现这一点,答案是:

s.replaceAll(".*?\\b" + key + "\\s*=\\s*(.*?)($|\\|.*)", "$1");

您可以对其进行测试here

答案 3 :(得分:2)

在这里使用replaceAll似乎有点矫枉过正,因为这种方法必须迭代整个String。相反,您可以使用匹配及其find方法,该方法将在匹配搜索的正则表达式(在情况key=value对中)后停止。

所以也许可以使用类似的东西:

static String getValueFromKey(String s, String key) {
    Matcher m = Pattern.compile(
            "(?<=^|\\|)\\s*" + Pattern.quote(key) + "\\b\\s*=\\s*(?<value>[^|]*)")
            .matcher(s);
    if (m.find())
        return m.group("value");
    else
        return null;// or maybe return empty String "" but that may be misleading 
                    // for values which are really empty Strings
}

答案 4 :(得分:0)

如果没有正则表达式,这很容易做到:

static String getValueFromKey(String s, String key) {
  string[] pairs = s.split("|");
  for (String p : pairs) {
      string[] halves = p.split("=");
      if (halves[0].equals(key)) {
          return halves[1];
      }
  }

  return "";
}

此代码字将String s分为&#39; |&#39; charachter,创建一个形式为String的数组&#34; key = value&#34;。然后它会在&#39; =&#39;上拆分这些键值对中的每一个。字符,直到找到key,并返回相关值。

是否有特定原因需要使用正则表达式而不是像这样的方法?