В Java, когда выполняется replaceAll для поиска шаблона регулярного выражения, например:
replaceAll("\\?i\\b(\\w+)\\b(\\s+\\1)+\\b", "$1");
(чтобы удалить дублирующиеся последовательные символы без учета регистра) словами, например, Test test), я не уверен, куда я положил ? i
. Я прочитал, что это должно быть в начале, но если я вычеркну его, то поймаю повторяющиеся слова подряд (например, тестовый тест), но не слова без учета регистра (например, тестовый тест). Поэтому я подумал, что мог бы добавить «я» в начале, но это, похоже, не делает работу. Какие-нибудь мысли? Спасибо!
RegexBuddy говорит мне, что если вы хотите включить его в начало, это правильный синтаксис:
"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"
Если все выражение нечувствительно к регистру, вы можете просто указать флаг CASE_INSENSITIVE
:
Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)
Да, нечувствительность к регистру можно по желанию включать и отключать в регулярном выражении 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
В общем, вы можете включать и отключать любой флаг в шаблоне по своему желанию.
java. util.regex.Pattern
/ regex / i
( Pattern.CASE_INSENSITIVE
в Java), вы можете сделать / (? I) regex /
/ first (? i) второй (? - i) третий /
/ первый (? i: второй) третий /
\ b
между \ w
и \ s
)