我正在尝试执行一些超级简单的解析o日志文件,因此我使用String.split
方法,如下所示:
String [] parts = input.split(",");
非常适合输入:
a,b,c
或者
type=simple, output=Hello, repeat=true
只是说些什么。
如何转义逗号,所以它与中间逗号不匹配?
例如,如果我想在其中一个部分中包含逗号:
type=simple, output=Hello, world, repeate=true
我在思考像:
type=simple, output=Hello\, world, repeate=true
但我不知道如何创建拆分以避免匹配逗号。
我试过了:
String [] parts = input.split("[^\,],");
但是,好吧,不行。
答案 0 :(得分:24)
您可以使用negative look behind解决此问题。
String[] parts = str.split("(?<!\\\\), ");
基本上它说,在每个 ", "
上拆分,而不是反斜杠。
String str = "type=simple, output=Hello\\, world, repeate=true";
String[] parts = str.split("(?<!\\\\), ");
for (String s : parts)
System.out.println(s);
输出:
type=simple
output=Hello\, world
repeate=true
如果你碰巧遇到了非转义的逗号分隔值,你可以执行以下(类似的)hack:
String[] parts = str.split(", (?=\\w+=)");
其中说明了每个 ", "
上的分割,后跟一些单词字符和=
答案 1 :(得分:4)
我担心,String.split
没有完美的解决方案。使用三个部分的匹配器将起作用。如果部件数量不恒定,我建议使用matcher.find
的循环。这样的事可能
final String s = "type=simple, output=Hello, world, repeat=true";
final Pattern p = Pattern.compile("((?:[^\\\\,]|\\\\.)*)(?:,|$)");
final Matcher m = p.matcher(s);
while (m.find()) System.out.println(m.group(1));
你可能也想跳过逗号之后的空格:
final Pattern p = Pattern.compile("((?:[^\\\\,]|\\\\.)*)(?:,\\s*|$)");
它并不复杂,只需注意你需要四个反斜杠才能匹配一个。
答案 2 :(得分:2)
逃避工作与aioobe的答案相反(更新:aioobe现在使用相同的构造但我不知道当我写这篇文章时),负面的背后隐藏
final String s = "type=simple, output=Hello\\, world, repeate=true";
final String[] tokens = s.split("(?<!\\\\),\\s*");
for(final String item : tokens){
System.out.println("'" + item.replace("\\,", ",") + "'");
}
<强>输出:强>
'类型=简单'
'输出=你好,世界' 'repeate =真'
<强>参考:强>
答案 3 :(得分:0)
我认为
input.split("[^\\\\],");
应该有效。它会在所有逗号之前拆分,而这些逗号前面没有反斜杠。 顺便说一句,如果您正在使用Eclipse,我可以推荐使用QuickRex插件来测试和调试Regex。