Приведенное ниже выражение должно работать правильно, чтобы найти любое количество последовательных слов. Сопоставление может быть нечувствительным к регистру.
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
Пример вывода: до свидания
Объяснение:
Выражение регулярного выражения:
\ b: начало границы слова
\ w +: любое количество символов слова
(\ s + \ 1 \ b) *: любое количество пробелов, за которым следует слово, которое соответствует предыдущему слову и заканчивается границей слова. Всё, завернутое в *, помогает найти более одного повтора.
Группировка:
m.group (0): должна содержать совпавшую группу в приведенном выше случае. До свидания, до свидания, GooDbYe.
m.group (1): Должен содержать первое слово совпадающего шаблона в приведенном выше случае. До свидания.
Метод Replace заменяет все последовательные совпадающие слова первым экземпляром слова.
person
Akriti
schedule
11.03.2019
not that that is related
- ›not that is related
)? заранее спасибо - person Antoine   schedule 20.04.2016\1
! - person Antoine   schedule 20.04.2016\b(\w+)\s+(\1\s*)+\b
? - person ytu   schedule 05.06.2018