Разделить регулярное выражение для извлечения строк смежных символов

Есть ли регулярное выражение, которое будет работать с String.split(), чтобы разбить строку на непрерывные символы, т.е. разделить, где следующий символ отличается от предыдущего символа?

Вот тестовый пример:

String regex = "your answer here";
String[] parts = "aaabbcddeee".split(regex);
System.out.println(Arrays.toString(parts));

Ожидаемый результат:

[aaa, bb, c, dd, eee]

Хотя в тестовом примере в качестве входных данных используются только буквы, это сделано только для ясности; входные символы могут быть любыми символами.


Пожалуйста, не предлагайте «обходные пути», включающие циклы или другие методы.

Вопрос состоит в том, чтобы найти правильное регулярное выражение для кода, как показано выше, т.е. только с использованием split() и никаких других вызовов методов. Это не вопрос поиска кода, который «выполнит эту работу».


person Bohemian♦    schedule 28.11.2012    source источник


Ответы (1)


Вполне возможно написать регулярное выражение для разделения за один шаг:

"(?<=(.))(?!\\1)"

Поскольку вы хотите разделить каждую группу одинаковых символов, нам просто нужно найти границу между двумя группами. Я достигаю этого, используя положительный просмотр только для того, чтобы захватить предыдущий символ, и использую отрицательный просмотр вперед и обратную ссылку, чтобы проверить, что следующий символ не является тем же самым символом.

Как видите, регулярное выражение имеет нулевую ширину (только 2 утверждения). Регулярное выражение не потребляет никаких символов.

person nhahtdh    schedule 28.11.2012
comment
в символе .net внутри группы, т.е. (.) также включается в результат.. интересно, почему это не так с java - person Anirudha; 28.11.2012
comment
@ Some1.Kill.The.DJ: Я думаю, между разными языками есть некоторые различия. Я понятия не имею, как добиться такого же эффекта в .NET (или Ruby, поскольку он также включает группу захвата в результате разделения). - person nhahtdh; 28.11.2012