使用String.split时转义逗号

时间:2011-02-10 21:30:39

标签: java regex

我正在尝试执行一些超级简单的解析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("[^\,],");

但是,好吧,不行。

4 个答案:

答案 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

ideone.com link


如果你碰巧遇到了非转义的逗号分隔值,你可以执行以下(类似的)hack:

String[] parts = str.split(", (?=\\w+=)");

其中说明了每个 ", "上的分割,后跟一些单词字符和=

ideone.com link

答案 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。