String regex在数据中使用分号进行解析

时间:2016-09-29 13:33:37

标签: java regex string

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

我正在使用字符串拆分但无法找到正确的正则表达式。我在下面尝试过尝试在==:

之前获取最后一个半冒号
query.split("(;)[^;]*==)

但它仅适用于第一个键值。

示例字符串:

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

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

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

如果nb_post之后只有;,则它似乎要分开,但它与==之间也没有;

你几乎在那里。您的代码应该是

==

请注意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*

答案 1 :(得分:1)

改为使用群组。并在循环中使用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

添加;?不幸的是,因为你的中间代币不再终止而无法工作。

答案 2 :(得分:0)

RegExp是邪恶的。

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

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

希望这有帮助。