如何组合正则表达式来拆分用分号分隔条件的fiql字符串(例如下面的例子)。问题是半冒号也可以在字符串中。
我正在使用字符串拆分但无法找到正确的正则表达式。我在下面尝试过尝试在==:
之前获取最后一个半冒号query.split("(;)[^;]*==)
但它仅适用于第一个键值。
示例字符串:
Key1==value1; key2==val;ue2;key3==value3
目标是数组或列表:key1==value1, key2==val;ue2, key3==value3
这里的问题是值2中的分号导致分裂。
有什么想法吗?
答案 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
希望这有帮助。