Разделить строку на повторяющиеся символы
Я хочу разбить строку "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");
}
}