2011-04-07 54 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);