java拆分字符串
問題引出:用^拆分如下字符串:B0005433^1~6^01^0001~0002^1,120~2,135^1,1,1,1,1,1^1,1,1
jdk文檔說明:
public String[] split(String regex)
根據(jù)給定的正則表達式的匹配來拆分此字符串。
該方法的作用是使用給定的表達式和限制參數(shù)0來調(diào)用兩參數(shù)split方法。因此數(shù)組中不包括結(jié)尾空字符串。
例如:字符串"boo:and:foo"產(chǎn)生帶有下面這些表達式的結(jié)果:
regex result
: {"boo","and","foo"}
o {"b","",":and:f"}
注:使用此方法時,limit默認是0。
public String[] split(String regex, int limit)
根據(jù)匹配給定的正則表達式來拆分此字符串。
此方法返回的數(shù)組包含此字符串的每個子字符串,這些子字符串由另一個匹配給定的表達式的子字符串終止或由字符串結(jié)束來終止。數(shù)組中的子字符串按它們在此字符串中的順序排列。如果表達式不匹配輸入的任何部分,則結(jié)果數(shù)組只具有一個元素,即此字符串。
limit 參數(shù)控制模式應用的次數(shù),因此影響結(jié)果數(shù)組的長度。
limit > 0,則模式將被最多應用limit-1次,數(shù)組長度不會大于limit,而且數(shù)組的最后項將包含超出最后匹配的定界符的所有輸入。
limit<0,則模式將被應用盡可能多的次數(shù),而且數(shù)組可以是任意長度。
limit=0,則模式將被應用盡可能多的次數(shù),數(shù)組可有任何長度,并且結(jié)尾空字符串將被丟棄。
例如:字符串"boo:and:foo"產(chǎn)生帶有下面這些表達式的結(jié)果:
regex limit result
: 2 {"boo","and:foo"}
: 5 {"boo","and","foo"}
: -2 {"boo","and","foo"}
o 5 {"b","",":and:f","",""}
o -2 {"b","",":and:f","",""}
o 0 {"b","",":and:f"}
jdk源碼:
public String[] split(String regex, int limit) {
return Pattern.compile(regex).split(this, limit);
}
//將給定的正則表達式編譯到模式中。
//public static Pttern compile(String regex)
public static Pattern compile(String regex) {
return new Pattern(regex, 0);
}
private Pattern(String p, int f) {
pattern = p;
flags = f;
// Reset group index count
capturingGroupCount = 1;
localCount = 0;
if (pattern.length() > 0) {
compile();
} else {
root = new Start(lastAccept);
matchRoot = lastAccept;
}
}
我們可以看到該方法最終是使用的正則表達式來拆分的。具體的文檔寫的很清楚。請參考jdk開發(fā)文檔。
public class Test {
public static void main(String[] args) {
String str = "B0005433^1~6^01^0001~0002^1,120~2,135^1,1,1,1,1,1^1,1,1";
System.out.println(Arrays.toString(Pattern.compile("[/p{^}]").split(str)));
}
}
注:此寫法會按照[、/、^三個字符來分割,所以我需要改成[{^}]或者\\^即可。
除了使用split()方法以外,我們還可以使用StringTokenizer來處理。
String xhrStr = "B0005433^1~6^01^0001~0002^1,120~2,135^1,1,1,1,1,1^1,1,1";
StringTokenizer toker = new StringTokenizer(xhrStr,"^");
String[] xhrArr = new String[toker.countTokens()];
int x = 0;
while(toker.hasMoreTokens()){
xhrArr[x] = toker.nextToken();
x++;
}
在java3編程思想中說:正則表達式取代了先前版本中所有與"用標記斷開"相關(guān)的類。
在java4編程思想中就已經(jīng)不提倡用StringTokenizer 來解決了,支持用正則表達式來分割字符串。
本文僅代表作者觀點,版權(quán)歸原創(chuàng)者所有,如需轉(zhuǎn)載請在文中注明來源及作者名字。
免責聲明:本文系轉(zhuǎn)載編輯文章,僅作分享之用。如分享內(nèi)容、圖片侵犯到您的版權(quán)或非授權(quán)發(fā)布,請及時與我們聯(lián)系進行審核處理或刪除,您可以發(fā)送材料至郵箱:service@tojoy.com






