【问题标题】:Java How To Parse String With Pattern [key1]value1[key2]value2[key3]value3Java如何使用模式[key1]value1[key2]value2[key3]value3解析字符串
【发布时间】:2016-02-24 15:21:59
【问题描述】:

我的 Java 程序中有一个具有以下模式的键值字符串:

[key1]value1[key2]value2[key3]value3

其中keys 和values 是字符串。

如何解析此字符串并将键值对放入 Map?

首先,通过用正则表达式分割字符串,它应该给出值,然后用相同的正则表达式解析字符串可以提供键。想出这个正则表达式是我的主要问题,因为我几乎没有使用过正则表达式。

【问题讨论】:

  • 键或值是否有明确的数据结构?
  • 试图想出一个正则表达式来搜索以“[”开头并以“]”结尾的单词。尴尬的是还是想不出正则表达式。
  • 键和值都是简单的字符串,键被包裹在键旁边的“[]”值
  • 请检查这是否有帮助stackoverflow.com/questions/2403122/…
  • 感谢 Edi,该问题上给出的正则表达式运行良好,现在我可以找到密钥了。谢谢 :)

标签: java regex


【解决方案1】:

一个正则表达式可以将字符串拆分成多个部分,一个简单的循环就可以将它添加到地图中;

    String input = "[key1]value1[key2]value2[key3]value3";

    // Gives ["", "key1", "value1", "key2", "value2", ...]
    String[] data = input.split("\\[|\\]");

    Map<String, String> dict = new HashMap<>();

    for(int i=1; i<data.length; )
        dict.put(data[i++], i == data.length ? "" : data[i++]);

put 中条件的原因是 `String.split' 删除了最后的空值,这意味着如果最后一个值为空,它将不会包含在数组中。条件只是检查值是否存在,如果不存在,则将其替换为空字符串。

【讨论】:

  • 这非常有效,并以最少的行数提供了解决方案。其他答案也应该有效,但是这个答案值得接受..
  • 顺便说一句,这个串联的目的是什么? input.concat("[a") 没有这个也可以工作。如果没有 concat 任何实例都不起作用?
  • @Tom concat 唯一要做的就是在最后一个值为空时求解,即[key1]value1[key2]strip 删除了导致问题的最后一个空值。我同意它看起来不太好,我用循环中内存密集度较低的检查代替了它。
【解决方案2】:

您可以使用两个不同的正则表达式轻松解析:

  1. 关键提取正则表达式是\\[(.*?)]
  2. 值提取正则表达式为\\](.*?)\\[|\\](.*)

示例:

public class KeyValueParse {

    public static void main(String[] args) {
        String input = "[key1]value1[key2]value2[key3]value3";

        String keyRegEx = "\\[(.*?)]";
        String valueRegEx = "\\](.*?)\\[|\\](.*)";

        Map<String, String> map = new HashMap<>();

        Pattern keyPattern = Pattern.compile(keyRegEx);
        Pattern valuePattern = Pattern.compile(valueRegEx);

        Matcher keyMatcher = keyPattern.matcher(input);
        Matcher valueMatcher = valuePattern.matcher(input);

        System.out.println("-----KeyValue pairs-------");
        while (keyMatcher.find() && valueMatcher.find()) {
            String key = keyMatcher.group().replaceAll("\\[|\\]", "");
            String value = valueMatcher.group().replaceAll("\\[|\\]", "");

            System.out.println("Key Pair : [ key = " + key + ", value= " + value + "]");
            //put key and value in map
            map.put(key, value);
        }
    }
}

【讨论】:

    【解决方案3】:

    你可以试试这个:

    String str = "[key1]value1[key2]value2[key3]value3";
    String[] strings = str.split("\\[");
    Map<String, String> map = new HashMap<>();
    for (String string : strings) {
        if (string.length() > 0) {
            String[] array = string.split("\\]");
            map.put(array[0], array[1]);
        }
    }
    System.out.println(map);
    

    结果如下:

    {key1=value1, key2=value2, key3=value3}
    

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多