数据中带分号的java字符串正则表达式解析
如何组合一个正则表达式来拆分用分号分隔条件的fiql字符串(下面的示例)。问题是分号也可以在字符串中
我正在使用字符串拆分,但找不到正确的正则表达式。我在下面尝试过,试图得到==之前的最后一个分号:
query.split("(;)[^;]*==)
但它只适用于第一个键值
示例字符串:
Key1==value1; key2==val;ue2;key3==value3
目标是数组或列表:key1==value1, key2==val;ue2, key3==value3
这里的问题是值2中的分号导致拆分
有什么想法吗
# 1 楼答案
RegExp是邪恶的
如果您可以请求对要分析的字符串进行最小的更改,那么值将被双qoutes包围,那么字符串可以像
Key1=="value1"; key2=="val;ue2";key3=="value3"
,那么这篇文章将帮助您 检查Java: splitting a comma-separated string but ignoring commas in quotes或者,您需要编写一个自定义字符串解析器。下面是一个快速的非优化CustomStringParser
希望这有帮助
# 2 楼答案
看起来您只想在
;
上拆分,前提是它后面有==
,而且它和该==
之间没有;
你快到了。您的代码应该如下所示
请注意
(?=...)
部分是positive look-ahead,它只检查;
之后是否存在可由子表达式[^;]*==
匹配的部分,但不包括在最终匹配中的该部分,因此在分割后它不会消失(它是zero-length匹配)演示:
输出:
如果您还想去掉
key2
之前的空格,那么将其作为要拆分的分隔符的一部分。因此,让正则表达式不仅匹配;
,还匹配它周围的空格。零个或多个空格可以用\s*
表示,因此您的代码看起来像# 3 楼答案
改为使用组。并在循环中使用
java.util.regex.Matcher
搜索标记:添加;?不幸的是,这不会起作用,因为你的中间代币将不再终止