在使用String.split方法分隔字符串時,分隔符如果用到一些特殊字符,可能會得不到我們預期的結果。
我們看jdk doc中說明
public String[] split(String regex)
Splits this string around matches of the given regular expression.
參數regex是一個 regular-expression的匹配模式而不是一個簡單的String,他對一些特殊的字符可能會出現你預想不到的結果,比如測試下面的代碼:
用豎線 | 分隔字符串,你將得不到預期的結果
? String[] aa = "aaa|bbb|ccc".split("|");
? //String[] aa = "aaa|bbb|ccc".split("\\|"); 這樣才能得到正確的結果
? for (int i = 0 ; i <aa.length ; i++ ) {
? ? System.out.println("--"+aa);
? }
用豎 * 分隔字符串運行將拋出java.util.regex.PatternSyntaxException異常,用加號 + 也是如此。
? String[] aa = "aaa*bbb*ccc".split("*");
? //String[] aa = "aaa|bbb|ccc".split("\\*"); 這樣才能得到正確的結果 ?
? for (int i = 0 ; i <aa.length ; i++ ) {
? ? System.out.println("--"+aa);
? }
顯然,+ * 不是有效的模式匹配規則表達式,用"\\*" "\\+"轉義后即可得到正確的結果。
"|" 分隔串時雖然能夠執行,但是卻不是預期的目的,"\\|"轉義后即可得到正確的結果。
還有如果想在串中使用"\"字符,則也需要轉義.首先要表達"aaaa\bbbb"這個串就應該用"aaaa\\bbbb",如果要分隔就應該這樣才能得到正確結果:
String[] aa = "aaa\\bbb\\bccc".split(\\\\);
JAVA中關于SPLIT方法的問題
<DIV id=msgcns!94407A6582AF46B7!300><DIV>今天發現一個簡單的問題,就是用SPLIT方法獲取的數組元素個數與實際應該得到的不相同,真是百思不其解。</DIV><DIV>? 經過大量嘗試和猜想,終于得出問題出在方法本身。實例:</DIV><DIV>????? 由程序自動生成了一個中為:</DIV><DIV>????? String xx = "100000004768262367, 梁旭, 男, 2147, 0, 2147, 1745.00, 402.00,, 1000.00,,,,,";</DIV><DIV>????? 以上語句實際上應該返回15個元素,但用SPLIT方法卻只返回了10元素(到1000.00為止)。</DIV><DIV>????? 照以上語句看就只能懷疑是方法本身的問題,但從何著手呢?</DIV><DIV>????? 呵呵,再一次證明了靈感是你無法去撲捉的,是無法勉強獲得的,它就是想來就來,想走就走的。</DIV><DIV>????? 逗號,就是它,不管了先試試。把后面的幾個全部去除,結果正確,再向前截取,結果還是正確,問題只會出現在后面的幾個逗號上。</DIV><DIV>???? 但這幾個簡單明了的逗號會出什么問題呢?難道是跟得太緊了呀?不會吧。這樣的話為什么1000.00前面的兩個能正確。</DIV><DIV>????? 看似找到問題所在,卻又好像是找了一個死胡同。</DIV><DIV>????? 經過漫長的思考后還是一愁莫展。最后還是決定試試唯一想到的問題所在,把后面每個逗號都間隔一個空格試試,天啦,沒想到奇跡是這樣出現的,結果竟然正確了!??!。</DIV><DIV>????? 繼續試了幾種情況:</DIV><DIV>??????String xx = " , , , ,, ";????? System.out.println(xx.split(",").length);</DIV><DIV>????? 以上語句輸出為6,與實際結果相符。</DIV><DIV><DIV>??????String xx = ",,,,, ";
????? System.out.println(xx.split(",").length);</DIV><DIV>????? 以上語句輸出為6,與實際結果相符。</DIV><DIV><DIV>??????String xx = " , , , ,,";
????? System.out.println(xx.split(",").length);</DIV><DIV>????? 以上語句輸出為4,與實際結果相符。</DIV><DIV><DIV>??????String xx = " , , , , ,";
????? System.out.println(xx.split(",").length);</DIV><DIV>????? 以上語句輸出為5,與實際結果相符。</DIV><DIV>經上以上測試,發現了問題就在于最后一個逗號。</DIV><DIV>如果最后沒有間隔字符則不能正確的返回元素。</DIV></DIV></DIV></DIV></DIV>