如何在数据中转义分隔符?

时间:2017-08-13 19:12:27

标签: java

我有一个标题列表,我想保存为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]。我做错了什么?

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”。然后拆分(“,”)