有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

数据中带分号的java字符串正则表达式解析

如何组合一个正则表达式来拆分用分号分隔条件的fiql字符串(下面的示例)。问题是分号也可以在字符串中

我正在使用字符串拆分,但找不到正确的正则表达式。我在下面尝试过,试图得到==之前的最后一个分号:

query.split("(;)[^;]*==)

但它只适用于第一个键值

示例字符串:

Key1==value1; key2==val;ue2;key3==value3

目标是数组或列表:key1==value1, key2==val;ue2, key3==value3 这里的问题是值2中的分号导致拆分

有什么想法吗


共 (3) 个答案

  1. # 1 楼答案

    RegExp是邪恶的

    如果您可以请求对要分析的字符串进行最小的更改,那么值将被双qoutes包围,那么字符串可以像Key1=="value1"; key2=="val;ue2";key3=="value3",那么这篇文章将帮助您 检查Java: splitting a comma-separated string but ignoring commas in quotes

    或者,您需要编写一个自定义字符串解析器。下面是一个快速的非优化CustomStringParser

    希望这有帮助

  2. # 2 楼答案

    看起来您只想在;上拆分,前提是它后面有==,而且它和该==之间没有;

    你快到了。您的代码应该如下所示

    split(";(?=[^;]*==)")
    

    请注意(?=...)部分是positive look-ahead,它只检查;之后是否存在可由子表达式[^;]*==匹配的部分,但不包括在最终匹配中的该部分,因此在分割后它不会消失(它是zero-length匹配)

    演示:

    String str = "Key1==value1; key2==val;ue2;key3==value3";
    for (String s : str.split(";(?=[^;]*==)")){
        System.out.println(s);
    }
    

    输出:

    Key1==value1
     key2==val;ue2
    key3==value3
    

    如果您还想去掉key2之前的空格,那么将其作为要拆分的分隔符的一部分。因此,让正则表达式不仅匹配;,还匹配它周围的空格。零个或多个空格可以用\s*表示,因此您的代码看起来像

    split("\\s*;\\s*(?=[^;]*==)")
    
  3. # 3 楼答案

    改为使用组。并在循环中使用java.util.regex.Matcher搜索标记:

    Pattern patrn = Pattern.compile("(?>(\\w+==[\\w;]+)(?:;\\s*|$))");
    Matcher mtchr = patrn.matcher("Key1==value1; key2==val;ue2;key3==value3");
    
    
    while(mtchr.find()) {
        System.out.println(mtchr.group(1));
    }
    
    Yields:
    Key1==value1
    key2==val;ue2
    key3==value3
    

    添加;?不幸的是,这不会起作用,因为你的中间代币将不再终止