2012-03-21 61 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

相關問題