Sim, a diferenciação de maiúsculas e minúsculas pode ser ativada e desativada à vontade no Java regex.
Parece que você quer algo assim:
System.out.println(
"Have a meRry MErrY Christmas ho Ho hO"
.replaceAll("(?i)\\b(\\w+)(\\s+\\1)+\\b", "$1")
);
// Have a meRry Christmas ho
Observe que o sinalizador incorporado não Pattern.CASE_INSENSITIVE
é . Observe também que um supérfluo foi removido do padrão.(?i)
\?i
\b
O (?i)
é colocado no início do padrão para permitir a não diferenciação de maiúsculas e minúsculas. Nesse caso específico, ele não é substituído posteriormente no padrão; portanto, todo o padrão não diferencia maiúsculas de minúsculas.
É importante notar que, na verdade, você pode limitar a não diferenciação de maiúsculas e minúsculas apenas a partes de todo o padrão. Assim, a questão de onde colocá-lo realmente depende da especificação (embora para este problema específico isso não importe, pois não faz \w
distinção entre maiúsculas e minúsculas.
Para demonstrar, aqui está um exemplo semelhante de séries de letras em colapso como "AaAaaA"
apenas "A"
.
System.out.println(
"AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
.replaceAll("(?i)\\b([A-Z])\\1+\\b", "$1")
); // A e I O u
Agora, suponha que especificamos que a execução só deve ser recolhida se começar com uma letra maiúscula. Então, devemos colocar o (?i)
no local apropriado:
System.out.println(
"AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
.replaceAll("\\b([A-Z])(?i)\\1+\\b", "$1")
); // A eeEeeE I O uuUuUuu
De maneira mais geral, você pode ativar e desativar qualquer sinalizador dentro do padrão conforme desejar.
Veja também
Perguntas relacionadas