2011-04-07 55 views
10

使用正則表達式的字符串會有人能夠幫助我與一些正則表達式。分裂Java中

我想分割以下字符串,數字,字符串數量要返回

"810LN15"

1方法需要810,另一個需要LN和其他應返回15

唯一真正的解決的辦法是使用正則表達式作爲數字將在長度

我可以使用什麼樣的正則表達式來適應這種增長?

+0

你的問題不清楚。你想分割「LN」,還是按照任何字母順序? – 2011-04-07 13:49:40

+0

嗨洛朗。在不同的方法中,我需要獲得這個字符串的不同部分,1個方法需要返回810,另一個需要LN,最後需要15個。我不想沿着使用子字符串和字符串計數的路線作爲長度的號碼可能會改變。您的幫助是非常讚賞與此 – Damien 2011-04-07 13:51:25

回答

16

String.split不會給你想要的結果,我猜會是「810」,「LN」,「15」,因爲它將不得不尋找一個令牌來拆分並且去掉該令牌。

嘗試PatternMatcher相反,使用此正則表達式:(\d+)|([a-zA-Z]+),這將匹配數字與字母的順序,並獲得不同數量/文組(即「AA810LN15QQ12345」將導致羣體「AA」,「810」, 「LN」,「15」,「QQ」和「12345」)。

例子:

Pattern p = Pattern.compile("(\\d+)|([a-zA-Z]+)"); 
Matcher m = p.matcher("810LN15"); 
List<String> tokens = new LinkedList<String>(); 
while(m.find()) 
{ 
    String token = m.group(1); //group 0 is always the entire match 
    tokens.add(token); 
} 
//now iterate through 'tokens' and check whether you have a number or text 
+0

嗨托馬斯,非常感謝您的輸入,我的問題現在已解決 – Damien 2011-04-07 14:26:26

7

(\\d+)([a-zA-Z]+)(\\d+)應該做的伎倆。第一捕獲組將是第一數量,所述第二捕獲組將在第三捕獲組之間,並且將所述第二數量的字母。雙反斜槓是用於java的。

+0

非常感謝您的輸入標記,它幫助我解決了我的問題 – Damien 2011-04-07 14:26:12

10

在Java中,因爲在大多數的正則表達式的風味(的Python是一個顯着的例外),則正則表達式split()不需要消耗任何字符,當它找到一個匹配。在這裏,我用向前看符號和lookbehinds匹配在它的數字一方和其他非數字的任何位置:

String source = "810LN15"; 
String[] parts = source.split("(?<=\\d)(?=\\D)|(?<=\\D)(?=\\d)"); 
System.out.println(Arrays.toString(parts)); 

輸出:

[810, LN, 15] 
0

這給你確切的你們要找的東西

 Pattern p = Pattern.compile("(([a-zA-Z]+)|(\\d+))|((\\d+)|([a-zA-Z]+))"); 
     Matcher m = p.matcher("810LN15"); 
     List<Object> tokens = new LinkedList<Object>(); 
     while(m.find()) 
     { 
      String token = m.group(1); 
      tokens.add(token); 
     } 
     System.out.println(tokens);