Да, нечувствительность к регистру можно включать и отключать по желанию в Java regex.
Похоже, вы хотите что-то вроде этого:
System.out.println(
"Have a meRry MErrY Christmas ho Ho hO"
.replaceAll("(?i)\\b(\\w+)(\\s+\\1)+\\b", "$1")
);
// Have a meRry Christmas ho
Обратите внимание, что внедрен Pattern.CASE_INSENSITIVE
флаг (?i)
, а не \?i
.Также обратите внимание, что один лишний \b
был удален из шаблона.
(?i)
помещается в начале шаблона, чтобы включить регистронезависимость.В данном конкретном случае он не переопределяется позднее в шаблоне, поэтому фактически весь шаблон не учитывает регистр.
Стоит отметить, что фактически вы можете ограничить регистронезависимость только частями целогошаблон.Таким образом, вопрос о том, где его поставить, действительно зависит от спецификации (хотя для этой конкретной проблемы это не имеет значения, поскольку \w
не учитывает регистр.
Чтобы продемонстрировать, вот аналогичный пример свертываниябукв от "AaAaaA"
до "A"
.
System.out.println(
"AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
.replaceAll("(?i)\\b([A-Z])\\1+\\b", "$1")
); // A e I O u
Теперь предположим, что мы указываем, что цикл должен быть свернут только в том случае, если он начинается с заглавной буквы. Затем мы должны поставить (?i)
в соответствующем месте:
System.out.println(
"AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
.replaceAll("\\b([A-Z])(?i)\\1+\\b", "$1")
); // A eeEeeE I O uuUuUuu
В общем, вы можете включать и отключать любые флаги внутри шаблона по вашему желанию.
См. также
Смежные вопросы