【问题标题】:How to split a string which contains multiple key value pairs如何拆分包含多个键值对的字符串
【发布时间】:2013-07-19 16:01:38
【问题描述】:

我有一个字符串:

Single line : Some text
Multi1: multi (Va1)    Multi2 : multi (Va2) Multi3 : multi (Val3)
Dots....20/12/2013 (EOY)

我正在尝试检索所有键值对。我的第一次尝试

(单行|多[0-9]{1}|点)( *:?[.] *| *:?)(.)

似乎可以工作,但不能在一行上处理多个键值对。有什么方法可以实现吗?

【问题讨论】:

    标签: java regex string-matching


    【解决方案1】:

    试试这个:

    String text = "Single line : Some text\r\n" + 
    "Multi1: multi (Va1)    Multi2 : multi (Va2) Multi3 : multi (Val3)\r\n" +
    "Dots....20/12/2013 (EOY)";
    Pattern pattern = Pattern.compile("(\\p{Alnum}[\\p{Alnum}\\s/]+?)\\s?(:|\\.+)\\s?(\\p{Alnum}[\\p{Alnum}\\s/]+?)(?=($|\\()|(\\s\\())", Pattern.MULTILINE);
    Matcher matcher = pattern.matcher(text);
    while (matcher.find()) {
        System.out.println(matcher.group(1) + "-->" + matcher.group(3));
    }
    

    输出:

    Single line-->Some text
    Multi1-->multi 
    Multi2-->multi 
    Multi3-->multi 
    Dots-->20/12/2013 
    

    解释:

    • 我将键和值限制为“以字母数字开头”, “包含任意数量的字母数字、空格或斜杠”。
    • 我将分隔符限制为“可选空格、:、可选空格”或 “可选空格,任意数量的连续点,可选空格”。
    • 我正在使用第 1 组和第 3 组来定义 Pattern
    • 第 2 组用于提供上述替代分隔符。
    • 最后,Pattern 在末尾被分隔,或者用新的 行,或者带有一个开放的圆括号,或者,带有一个空格,后跟一个 打开圆括号。

    请注意,您不能在前瞻或后瞻组中使用量词,因此会出现重复。

    【讨论】:

      【解决方案2】:

      你可以使用这个模式:

      public static void main(String[] args) {
      
          String s = "Single line : Some text\n"
                   + "Multi1: multi (Va1)    Multi2 : multi (Va2) "
                   + "Multi3 : multi (Val3)\n"
                   + "Dots....20/12/2013 (EOY)";
      
          String wd = "[^\\s.:]+(?:[^\\S\\n]+[^\\s.:]+)*";
          Pattern p = Pattern.compile("(?<key>" + wd + ")"
                                    + "\\s*(?::|\\.+)\\s*"
                                    + "(?<value>" + wd + "(?:\\s*\\([^)]+\\))?)"
                                    + "(?!\\s*:)(?=\\s|$)");
          Matcher m = p.matcher(s);
      
          while (m.find()) {
              System.out.println(m.group("key")+"->"+m.group("value"));
          }
      }
      

      【讨论】:

        【解决方案3】:

        我不记得确切的语法,但我认为它是这样的:

        while (matcher.find()) {
          String match = matcher.group();
        }
        

        这里的目标是你需要遍历当前行并告诉它“当你还在寻找东西时,将这一行中匹配的字符串返回给我”。由于您在同一行上有多个匹配项,因此它应该不断为您提取结果。 Here is the JavaDoc 供 Matcher 作为参考。

        遗憾的是,这也是 Java 不太适合这类事情的另一个原因,在任何人对我进行降级理解之前,我说这是对 Java API 的批评,而不是对语言的批评。

        【讨论】:

        • 我知道语法,但正则表达式将 line2 的第一个分号之后的所有内容视为值,而不是拆分它。
        猜你喜欢
        • 2023-03-13
        • 1970-01-01
        • 2020-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多