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

Java 如何在数据中转义分隔符?,java,Java,我有一个要保存为字符串的标题列表: -标题1 -标题2 -title|3 现在,我想将其保存为一行字符串,由|分隔,这意味着它将以以下方式结束:标题1 |标题2 |标题3 但是现在,当我拆分字符串时: String input = "title1|title2|title|3"; String[] splittedInput = input.split("\\|"); splittedInput将是以下数组:{“title1”、“title2”、“title”、“3”} 显然,这不是我想要的,

我有一个要保存为
字符串的标题列表:
-
标题1

-
标题2

-
title|3

现在,我想将其保存为一行
字符串
,由
|
分隔,这意味着它将以以下方式结束:
标题1 |标题2 |标题3

但是现在,当我拆分
字符串时:

String input = "title1|title2|title|3";
String[] splittedInput = input.split("\\|");
splittedInput
将是以下数组:
{“title1”、“title2”、“title”、“3”}

显然,这不是我想要的,我希望数组的第三个条目是
title | 3

现在我的问题是:如何正确地转义标题中的
|
,以便在拆分
字符串时,得到三个标题的正确数组,而不是4个标题


@Gábor Bakos

运行此代码段:

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));
String input=“title1 | title2 | title\\\\| 3”;

String[]split=input.split((?您可以使用任何东西。例如,与
\
一起使用:

 "title1|title2|title\\|3".split("(?<!\\\\)\\|").map(_.replaceAll("\\\\(?=\\|)", "")) //Scala syntax
删除转义字符也需要最终映射


(?是,
(?=\\\\\\)
是对转义的
的额外展望。您可以使用任何东西。例如,
\

 "title1|title2|title\\|3".split("(?<!\\\\)\\|").map(_.replaceAll("\\\\(?=\\|)", "")) //Scala syntax
删除转义字符也需要最终映射


(?is,
(?=\\\\\\\)
是转义的

使用另一个分隔符,例如“title1,title2,title | 3”,而不是“title1 | title2 | title | 3”。然后拆分(“,”)

使用另一个分隔符,例如“title1,title2,title | 3”,而不是“title1 | title2 | title2 |”;title |然后拆分(“,”)

如果您使用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());
}
publicstaticvoidmain(字符串[]args){
//打印出[标题1,标题2,标题3,标题4]
System.out.println(parsePipeSeparated(“title1 | title2 | title\\\\| 3 | title\\\| 4”);
}
私有静态列表(字符串输入){

返回Stream.of(input.split)((?如果您使用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());
}
publicstaticvoidmain(字符串[]args){
//打印出[标题1,标题2,标题3,标题4]
System.out.println(parsePipeSeparated(“title1 | title2 | title\\\\| 3 | title\\\| 4”);
}
私有静态列表(字符串输入){


返回Stream.of(input.split(“(?使用CSV解析器将使您的问题消失CSV解析器将如何解决?关于您的编辑,@ikhebgeenaccount可能重复:它应该是
replaceAll
as
replace
replace逐字替换,而不是匹配的正则表达式。使用CSV解析器将使您的问题消失CSV解析器将如何解决?可能是d。)@ikhebgeenaccount关于您的编辑的副本:它应该是
replaceAll
作为
replace
逐字替换,而不是匹配正则表达式。这确实回答了我的问题,但我想要一个解决方案,它适用于任何字符,因为我不知道标题中会出现什么字符,但同样的问题也会出现ise代表逗号。真正的解决方案是有转义。这确实回答了我的问题,但我想要一个可以与任何字符一起使用的解决方案,因为我永远不知道标题中会出现什么字符,但逗号也会出现同样的问题。真正的解决方案是有转义。我想保留第三个标题为
title | 3
youGH现在应该得到修复。如果还有
标题\4
,考虑到
replaceAll
调用,我将如何处理该问题?@ikhebgeenaccount在更新版本中不匹配:
title | 3
though现在应该被修复。现在如果还有一个
title\4
,考虑到
replaceAll
调用,@ikhebgeenaccount在更新版本中不匹配:
(“title1 | title2 | title\\\| 3 | title\\4”。拆分((?好的,在评论中不起作用,编辑我的帖子。