我正在尝试执行一些超级简单的解析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)
如果你碰巧遇到了非转义的逗号分隔值,你可以执行以下(类似的)hack:
String[] parts = str.split(", (?=\\w+=)");
Run Code Online (Sandbox Code Playgroud)
其中说的是每个分", "词后面跟着一些单词字符和=
恐怕,没有完美的解决方案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)
这并不复杂,只需注意您需要四个反斜杠才能匹配一个。