2016-03-18 2 views
1

У меня есть некоторые объекты String, которые мне нужно разбить на массив подстрок в местах расположения разных последовательных символов.Java Regex для поиска местоположения разных последовательных символов

Мой вход/выход должен выглядеть следующим образом:

"AAAA" -> ["AAAA"] 
"AAAABBB" -> ["AAAA", "BBB"] 
"ABBCCC" -> ["A", "BB", "CCC"] 

Я хочу, чтобы иметь возможность написать строку кода, как это:

String[] charRuns = str.split(regex); 

Где str является входным и charRuns является выход, но что должно быть значение regex?

+1

[Этот вопрос] (http://stackoverflow.com/questions/15101577/split-string-when-character-changes-possible-regex-solution) может быть полезным – Oli

+0

Я бы не regex, что ... –

+0

@Thomas Я принимаю любое решение, которое обеспечивает вход и выход, которые мне нужны, я бы предпочел регулярное выражение для простого кода. – 4castle

ответ

4

Не можете найти способ сделать это с split еще, но вот решение, основанное на Pattern, Matcher и итерации:

String test = "ABBCCCDDDDE"; 
//       | any character, grouped for back-reference 
//       | | immediate back-reference 
//       | | | 0+ repetition, greedy 
Pattern p = Pattern.compile("(.)\\1*"); 
Matcher m = p.matcher(test); 
while (m.find()) System.out.println(m.group()); 

Выходной

A 
BB 
CCC 
DDDD 
E 
+0

Это потрясающее решение! Я буду принимать его, как только я уверен, что регулярного выражения не существует для метода 'str.split'. – 4castle

+0

@ 4castle спасибо! Это решение ** ** основано на регулярном выражении. Но, вероятно, есть способ передать шаблон «String # split», хотя вам, вероятно, нужно будет выяснить способ «look-around» s, поскольку аргумент 'split' представляет разделитель, а не токен. – Mena

+0

@ 4castle это длинный способ сделать это. См. Дубликат для [как это сделать, используя 'split()'] (http://stackoverflow.com/a/13596720/256196) – Bohemian

0

Существует действительно простой способ сделать это без использования Java regex вообще, вот для него псевдокод:

получите первый символ строки, сохраните его в переменной firstChar.

count -> 1 
startIndex -> 0 
create a new arrayList to store the strings. 
while(count <= string.length){ 
    newChar -> string.charAt(count) 
    If(newChar != firstChar){ 
     arrayList.add(string.substring(startIndex, count) 
     firstChar = newChar 
     startIndex = count 
    } 
    increment count 
    } 

Как только у вас есть данные в массиве, вы можете перебирать его и создавать отдельные массивы.