2013-10-30 85 views
1

雖然試圖將一個字符串xyz213123kop234430099kpf4532分割成tokens:爲什麼字符串不分裂?

xyz213123 
kop234430099 
kpf4532 

我寫了下面的代碼,但的

String s = "xyz213123kop234430099kpf4532"; 
String regex = "/^[a-zA-z]+[0-9]+$/"; 
String tokens[] = s.split(regex); 
for(String t : tokens) { 
    System.out.println(t); 
} 

代替令牌,我得到整個字符串作爲一個輸出。 正則表達式我用過了什麼?

+0

我不認爲這可以用'split'和正則表達式來完成,因爲'split'刪除你搜索任何正則表達式的匹配;但你希望你的分裂根本沒有任何消除。 –

回答

3

你可以這樣做:

String s = "xyz213123kop234430099kpf4532"; 
String[] result = s.split("(?<=[0-9])(?=[a-z])"); 

的想法是使用零個寬度斷言找到的地方,以繩剪斷,然後我用一個回顧後(由數字[0-9]開頭)和前瞻(後面跟一個字母[a-z])。

這些lookarounds只是檢查和匹配什麼都沒有,因此split的分隔符是一個空字符串,並且沒有字符從結果中刪除。

+1

精彩的回答。我也學到了一些東西! :-) –

+0

啊,你打敗了我! =) – hwnd

+0

@DavidWallace:謝謝。 –

1

由於表達式以^(字符串的開頭)開始,並以$(字符串的結尾)結尾,因此字符串中沒有與正則表達式匹配的內容。所以它要麼匹配整個字符串,要麼一無所有。但是因爲它與字符串不匹配,所以在將字符串拆分爲標記時找不到它。這就是爲什麼你只得到一個大牌。

+0

那顯而易見!我想我誤解了'regex'。這不是指'從字母開始到數字結束嗎? – saplingPro

+0

這意味着有一些字母,然後有一些數字。但不是混合物。它必須是所有的字母,然後是所有的數字。 –

+0

如果是這樣,爲什麼不分割字符串。 '正則表達式'只是告訴我想要字符串拆分的方式 – saplingPro

1

你不想使用splitsplit的參數是令牌之間的分隔符。你沒有這個。相反,你有一個重複的模式,你希望每個匹配的模式。試試這個:

String s = "xyz213123kop234430099kpf4532"; 
Pattern p = Pattern.compile("([a-zA-z]+[0-9]+)"); 
Matcher m = p.matcher(s); 
while (m.find()) { 
    System.out.println(m.group()); 
} 

輸出:

xyz213123
kop234430099
kpf4532

(我不知道由什麼邏輯,你將有第二個令牌是「3kop234430099 「在你發佈的問題中,我認爲領先的」3「是一個錯字。)

+0

這是一個錯字。但是我沒有讓你不使用'split'方法。如果你可以更清楚地看到關於分割的文檔說'把這個字符串分割成給定正則表達式的匹配。' – saplingPro

+0

假設你有一個字符串「123456789」。所以你可以把這個字符串'拆分'爲正則表達式「4」的匹配,給出子字符串「123」和「56789」。 – Pines

+0

@Pines當我想到我創建的一個_delimiter_的正則表達式時,我也沒有感覺到。 – saplingPro

2

你可以在數字和非數字之間進行匹配。

String s = "xyz213123kop234430099kpf4532"; 
String[] parts = s.split("(?<![^\\d])(?=\\D)"); 
for (String p : parts) { 
    System.out.println(p); 
} 

輸出

xyz213123 
kop234430099 
kpf4532