为什么String.split需要管道分隔符才能被转义?
我想分析一个文件,每行都有管道分隔值。 当我没有在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()
方法?
String.split
需要一个正则表达式参数。一个非转义的|
被解析为一个正则表达式,意思是“空字符串或空字符串”,这不是你的意思。
因为该参数的语法为split是一个正则表达式,其中'|'具有OR的特殊含义,并且'\ |'意味着一个文字'|'所以字符串“\\ |”意味着正则表达式'\ |'这意味着完全匹配字符'|'。
感谢您的解释。我几乎总是忘记使用双重逃脱。现在我知道为什么会那样,从现在开始,它肯定会帮助我记住。 – sufinawaz 2014-11-03 21:10:13
如果String行的值有一些Pipe字符,会发生什么情况?你将如何分裂而不会分裂转义管道\ | ? – AlexandreJ 2015-09-28 17:56:14
@AlexandreJ您是否在问如何将一行看起来像:'Some | Delimited | Text | With | An \ | Embedded | Pipe | Char'分割为'(“Some”,“Delimited”,“Text”,“With “,”An \ | Embedded“,”Pipe“,”Char“)'? split函数不支持像这样转义,但是你也许可以创建一个适用于这种情况的正则表达式,就像在组后面使用零宽度的负断言:'(? dlamblin 2015-10-21 23:10:33
你可以简单地这样做:下面
String[] arrayString = yourString.split("\\|");
你必须逃避\使用你的正则表达式“yourString.split(”\\ |“)”这是正确的公式。 – mautrok 2015-12-07 13:57:03
的答案回答了“为什么”,但仅供参考,如果你想匹配一个字符串中,还可以看看[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
+1对'Pattern.quote' – redDevil 2014-08-26 11:13:27