使用 String.split 时转义逗号

2022-09-02 01:08:34

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

但是,好吧,不起作用。


答案 1

你可以用一个负面的眼光来解决它。

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 链接)


如果您碰巧遇到非转义逗号分隔值,则可以执行以下(类似)hack操作:

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

它表示每个“, ”的拆分,后跟一些单词字符和 =

(ideone.com 链接)


答案 2

恐怕没有完美的解决方案。对三个部分使用匹配器将起作用。如果零件数量不是恒定的,我建议使用.也许像这样的东西String.splitmatcher.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*|$)");

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