Приведенное ниже выражение должно работать правильно, чтобы найти любое количество последовательных слов. Соответствие может быть нечувствительным к регистру.
String regex = "\\b(\\w+)(\\s+\\1\\b)*";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(input);
// Check for subsequences of input that match the compiled pattern
while (m.find()) {
input = input.replaceAll(m.group(0), m.group(1));
}
Пример ввода: Goodbye goodbye GooDbYe
Пример вывода: до свидания
Объяснение:
Выражение регулярного выражения:
\ b: начало границы слова
\ w +: любое количество символов слова
(\ s + \ 1 \ b) *: любое количество пробелов, за которыми следует слово, которое соответствует предыдущему слову и заканчивается границей слова. Все, завернутое в *, помогает найти более одного повтора.
Группировка:
m.group (0): должна содержать совпавшую группу в приведенном выше случае. До свидания, до свидания, GooDbYe.
m.group (1): Должен содержать первое слово совпадающего шаблона в приведенном выше случае до свидания
Метод Replace заменяет все последовательные совпадающие слова первым экземпляром слова.