2012-03-21 38 views
140

我想分析一个文件,每行都有管道分隔值。 当我没有在split方法中转义管道分隔符时它没有正常工作,但是如下所示,我在转义管道后正常工作。为什么String.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; 
} 

是否有人可以解释为什么管道字符需要转义为split()方法?

+13

的答案回答了“为什么”,但仅供参考,如果你想匹配一个字符串中,还可以看看[Pattern.quote]( http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#quote(java.lang.String))。它需要一个'String'并且返回一个匹配输入的正则表达式'String'(即,它负责所有的转义)。 – yshavit 2012-03-21 16:43:32

+0

+1对'Pattern.quote' – redDevil 2014-08-26 11:13:27

回答

175

String.split需要一个正则表达式参数。一个非转义的|被解析为一个正则表达式,意思是“空字符串或空字符串”,这不是你的意思。

76

因为该参数的语法为split是一个正则表达式,其中'|'具有OR的特殊含义,并且'\ |'意味着一个文字'|'所以字符串“\\ |”意味着正则表达式'\ |'这意味着完全匹配字符'|'。

+1

感谢您的解释。我几乎总是忘记使用双重逃脱。现在我知道为什么会那样,从现在开始,它肯定会帮助我记住。 – sufinawaz 2014-11-03 21:10:13

+0

如果String行的值有一些Pipe字符,会发生什么情况?你将如何分裂而不会分裂转义管道\ | ? – AlexandreJ 2015-09-28 17:56:14

+0

@AlexandreJ您是否在问如何将一行看起来像:'Some | Delimited | Text | With | An \ | Embedded | Pipe | Char'分割为'(“Some”,“Delimited”,“Text”,“With “,”An \ | Embedded“,”Pipe“,”Char“)'? split函数不支持像这样转义,但是你也许可以创建一个适用于这种情况的正则表达式,就像在组后面使用零宽度的负断言:'(?<!\\)\ | '这将是'line.split(“(?<!\\\\)\\ |”); ' – dlamblin 2015-10-21 23:10:33

6

你可以简单地这样做:下面

String[] arrayString = yourString.split("\\|"); 
+0

你必须逃避\使用你的正则表达式“yourString.split(”\\ |“)”这是正确的公式。 – mautrok 2015-12-07 13:57:03

相关问题