Да, нечувствительность к регистру может быть включена и отключена по желанию в регулярном выражении 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
нечувствителен к регистру.
Чтобы продемонстрировать, вот аналогичный пример сворачивания серий букв типа "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
В общем, вы можете включать и отключать любой флаг в шаблоне по своему желанию.
Смотрите также
Связанные вопросы
person
polygenelubricants
schedule
09.08.2010