Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么String.split需要转义管道分隔符?_Java_Regex_String - Fatal编程技术网

Java 为什么String.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

我试图解析一个文件,该文件的每一行都有管道分隔值。 当我在split方法中没有转义管道分隔符时,它不能正常工作,但在我转义管道后,它工作正常,如下所示

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(\\\\”),这是正确的公式。