Разделить строку на повторяющиеся символы

Я хочу разбить строку "aaaabbbccccaaddddcfggghhhh" на "aaaa", "bbb", "cccc". "aa", "dddd", "c", "f" и т.д.

Я пробовал это:

String[] arr = "aaaabbbccccaaddddcfggghhhh".split("(.)(?!\\1)");

Но это съедает один символ, поэтому с приведенным выше регулярным выражением я получаю "aaa", в то время как я хочу, чтобы он был "aaaa" в качестве первой строки.

Как мне это достичь?

Ответы

Ответ 1

Попробуйте следующее:

String   str = "aaaabbbccccaaddddcfggghhhh";
String[] out = str.split("(?<=(.))(?!\\1)");

System.out.println(Arrays.toString(out));
=> [aaaa, bbb, cccc, aa, dddd, c, f, ggg, hhhh]

Объяснение: мы хотим разделить строку на группы одинаковых символов, поэтому нам нужно выяснить "границу" между каждой группой. Я использую синтаксис Java для позитивного поиска, чтобы выбрать предыдущий char, а затем отрицательный внешний вид с обратной ссылкой, чтобы убедиться, что следующий char не совпадает с предыдущим. Никаких символов на самом деле не потреблялось, потому что использовались только два утверждения обхода (т.е. Регулярное выражение равно нулю).

Ответ 2

Как насчет захвата в lookbehind?

(?<=(.))(?!\1|$)

как строка Java:

(?<=(.))(?!\\1|$)

Ответ 3

здесь я беру каждый символ и проверяю два условия в цикле if, т.е. String не может превышать длину, и если следующий символ не равен первому символу, продолжайте цикл for else, возьмите новую строку и распечатайте ее.

for (int i = 0; i < arr.length; i++) {
    char chr= arr[i];
    System.out.print(chr);
    if (i + 1 < arr.length && arr[i + 1] != chr) {
        System.out.print(" \n");
    }
}