使用String.split时转义逗号

Osc*_*Ryz 17 java regex

我正在尝试执行一些超级简单的解析o日志文件,所以我使用这样的String.split方法:

String [] parts = input.split(",");
Run Code Online (Sandbox Code Playgroud)

并且非常适合输入:

a,b,c
Run Code Online (Sandbox Code Playgroud)

要么

type=simple, output=Hello, repeat=true 
Run Code Online (Sandbox Code Playgroud)

只是说些什么.

我怎么能逃脱逗号,所以它与中间逗号不匹配?

例如,如果我想在其中一个部分中包含逗号:

type=simple, output=Hello, world, repeate=true
Run Code Online (Sandbox Code Playgroud)

我想的是:

type=simple, output=Hello\, world, repeate=true
Run Code Online (Sandbox Code Playgroud)

但我不知道如何创建拆分以避免匹配逗号.

我试过了:

String [] parts = input.split("[^\,],");
Run Code Online (Sandbox Code Playgroud)

但是,嗯,不起作用.

aio*_*obe 24

您可以使用背后负面看法来解决它.

String[] parts = str.split("(?<!\\\\), ");
Run Code Online (Sandbox Code Playgroud)

基本上它说,在每个", "没有反斜杠的前面分开.

String str = "type=simple, output=Hello\\, world, repeate=true";
String[] parts = str.split("(?<!\\\\), ");
for (String s : parts)
    System.out.println(s);
Run Code Online (Sandbox Code Playgroud)

输出:

type=simple
output=Hello\, world
repeate=true
Run Code Online (Sandbox Code Playgroud)

(ideone.com链接)


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

String[] parts = str.split(", (?=\\w+=)");
Run Code Online (Sandbox Code Playgroud)

其中说的是每个分", "词后面跟着一些单词字符和=

(ideone.com链接)

  • 很好的解决方案,但恕我直言的错误的问题.虽然这样的字符串可以使用它来解析,但有一天它会失败,有人说`type = simple,output = Hello,world,repeat = until明天,或者可能直到0 = 1`.我建议一个适当的转义机制,而不是太聪明. (2认同)
  • 它可以工作,但它不能在逗号上拆分,前面是转义反斜杠,如"type = simple \\\\,output = Hello \\,world \\\\,repeate = true"`.这将需要无限制的lookbehind,这在Java中不起作用.这就是为什么我说,String.split没有完美的解决方案. (2认同)

maa*_*nus 5

恐怕,没有完美的解决方案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));
Run Code Online (Sandbox Code Playgroud)

您可能还想跳过逗号后的空格:

final Pattern p = Pattern.compile("((?:[^\\\\,]|\\\\.)*)(?:,\\s*|$)");
Run Code Online (Sandbox Code Playgroud)

这并不复杂,只需注意您需要四个反斜杠才能匹配一个。