我有一个标题列表,我想保存为String
:
- title1
- title2
- title|3
现在,我想将此保存为由String
分隔的单行|
,这意味着它最终会如下所示:title1|title2|title|3
。
但现在,当我分割String
:
String input = "title1|title2|title|3";
String[] splittedInput = input.split("\\|");
splittedInput
将是以下数组:{"title1", "title2", "title", "3"}
。
显然,这不是我想要的,我希望数组的第三个条目为title|3
。
现在我的问题是:我如何正确地逃避标题中的|
,这样当我分割String
时,我最终会得到正确的三个标题数组,而不是4?
@GáborBakos
运行此代码段:
String input = "title1|title2|title\\|3";
String[] split = input.split("(?<!\\\\)\\|");
for (int i = 0; i < split.length; i++) {
split[i] = split[i].replace("\\\\(?=\\|)", "");
}
System.out.println(Arrays.toString(split));
我得到了这个输出:[title1, title2, title\|3]
。我做错了什么?
答案 0 :(得分:4)
你可以使用任何东西。例如\
:
"title1|title2|title\\|3".split("(?<!\\\\)\\|").map(_.replaceAll("\\\\(?=\\|)", "")) //Scala syntax
由于:
Array(title1, title2, title|3)
还需要最终映射来删除转义字符。
(?<!\\\\)
为look behind,(?=\\|)
是转发|
的额外预测。
答案 1 :(得分:2)
如果您使用TSV格式,所选的分隔符绝不能保留在数据中。
您可以简单地转义您的数据(例如title1|title2|title\|3
),然后您将分成(?<!\\)|
(负面反馈)。
在Java中,它给出了:
public static void main(String[] args) {
// prints out [title1, title2, title|3, title|4]
System.out.println(parsePipeSeparated("title1|title2|title\\|3|title\\|4"));
}
private static List<String> parsePipeSeparated(String input) {
return Stream.of(input.split("(?<!\\\\)\\|"))
.map(escapedText -> escapedText.replace("\\|", "|"))
.collect(Collectors.toList());
}
答案 2 :(得分:0)
使用另一个分隔符,例如“title1,title2,title | 3”,而不是“title1 | title2 | title | 3”。然后拆分(“,”)