Java 为什么String.split需要转义管道分隔符?
我试图解析一个文件,该文件的每一行都有管道分隔值。 当我在split方法中没有转义管道分隔符时,它不能正常工作,但在我转义管道后,它工作正常,如下所示Java 为什么String.split需要转义管道分隔符?,java,regex,string,Java,Regex,String,我试图解析一个文件,该文件的每一行都有管道分隔值。 当我在split方法中没有转义管道分隔符时,它不能正常工作,但在我转义管道后,它工作正常,如下所示 private ArrayList<String> parseLine(String line) { ArrayList<String> list = new ArrayList<String>(); String[] list_str = line.split("\\|"); // note
private ArrayList<String> parseLine(String line) {
ArrayList<String> list = new ArrayList<String>();
String[] list_str = line.split("\\|"); // note the escape "\\" here
System.out.println(list_str.length);
System.out.println(line);
for(String s:list_str) {
list.add(s);
System.out.print(s+ "|");
}
return list;
}
private ArrayList parseLine(字符串行){
ArrayList=新建ArrayList();
String[]list\u str=line.split(“\\\\”);注意这里的转义“\\”
系统输出打印长度(列表长度);
系统输出打印项次(行);
用于(字符串s:list_str){
列表。添加(s);
系统输出打印(s+“|”号);
}
退货清单;
}
有人能解释一下为什么需要对
split()
方法的管道字符进行转义吗?因为该参数的语法是正则表达式,其中在“\\”中有一个特殊的或含义,“\\\\”表示文字“\\\”,所以字符串“\\\\\”表示正则表达式“\\”,表示与字符“\\”完全匹配。字符串。split
需要一个正则表达式参数。未转义的|
被解析为regex,意思是“空字符串或空字符串”,这不是您的意思。您可以简单地执行以下操作:
String[] arrayString = yourString.split("\\|");
下面的答案回答了“为什么”,但仅供参考,如果您试图匹配文字字符串,您也可以查看。它接受一个
字符串
,并返回一个与输入匹配的正则表达式字符串
(即,它为您处理所有转义)。+1表示模式。quote
感谢您的解释。我几乎总是忘记使用双重逃生。现在我知道了为什么会这样,这肯定会帮助我从现在开始记住。如果字符串行的值有一些管道字符,会发生什么?在不拆分转义管道的情况下,您如何能够拆分?@AlexandreJ您是在问如何拆分一行这样的代码:Some | Delimited | Text | With | An | Embedded | pipe | Char
(“Some”,“Delimited”,“Text”,“With”,“An | Embedded”,“pipe”,“Char”)?split函数不支持这样的转义,但您可能可以创建一个适用于这种情况的正则表达式,比如使用零宽度负断言look-behind组:(?)即line.split((?)必须转义\才能使用您的regex“yourString.split(\\\\”),这是正确的公式。