Выражение ниже должно работать правильно, чтобы найти любое количество последовательных слов. Соответствие может быть без учета регистра.
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): должна содержать совпадающую группу в указанном выше случае. До свидания, до свидания
m.group (1): должно содержать первое слово сопоставленного шаблона в вышеприведенном случае. До свидания
Метод замены должен заменить все последовательные совпадающие слова на первый экземпляр слова.