Да, нечувствительность к регистру может быть включена и отключена по желанию в регулярном выражении Java.
Похоже, вам нужно что-то вроде этого:
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
регистр не учитывается.
Чтобы продемонстрировать, вот аналогичный пример сворачивания серий букв like "AaAaaA"
to just "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
В общем, вы можете включать и отключать любой флаг в шаблоне по своему желанию.
Смотрите также
Связанные вопросы