2012-06-27 4 views
6

Если у меня есть строка типа «11E12C108N», которая является конкатенацией групп букв и групп цифр, как мне разделить их без разделительного символа пробела между ними?Regex разделяет числа и группы букв без пробелов

Например, я хочу, чтобы в результате раскола быть:

tokens[0] = "11" 
tokens[1] = "E" 
tokens[2] = "12" 
tokens[3] = "C" 
tokens[4] = "108" 
tokens[5] = "N" 

У меня есть это прямо сейчас.

public static void main(String[] args) { 

    String stringToSplit = "11E12C108N"; 

    Pattern pattern = Pattern.compile("\\d+\\D+"); 
    Matcher matcher = pattern.matcher(stringToSplit); 

    while (matcher.find()) { 
     System.out.println(matcher.group()); 
    } 
} 

Который дает мне:

11E 
12C 
108N 

Могу ли я сделать оригинальный регулярное выражение сделать полный раскол в один присест? Вместо того, чтобы снова запускать регулярное выражение на промежуточных токенах?

ответ

5

Используйте следующее regex и получите список всех совпадений. Это будет то, что вы ищете.

\d+|\D+ 

В Java, я думаю, что код будет выглядеть примерно так:

Matcher matcher = Pattern.compile("\\d+|\\D+").matcher(theString); 
while (matcher.find()) 
{ 
    // append matcher.group() to your list 
} 
3

Вы можете также использовать "осмотреться" в разделенном регулярных выражений

String stringToSplit = "11E12C108N"; 
String[] tokens = stringToSplit .split("(?<=\\d)(?=\\D)|(?=\\d)(?<=\\D)"); 
System.out.println(Arrays.toString(tokens)); 

из [11, E, 12, C, 108, N]

Идея заключается в разделении в местах, находящихся между цифрами (\d) и нецифровой (\D). Другими словами, это место (пустая строка), которые имеют:

  • цифра перед (?<=\d) и нецифры после (?=\D)
  • нецифровой перед тем (?<=\D) и цифры после того, как (?=\d)

Больше информации около (?<=..) и (?=..) (и еще несколько) вы можете найти на http://www.regular-expressions.info/lookaround.html

Смежные вопросы