Sí, la insensibilidad a mayúsculas y minúsculas se puede habilitar y deshabilitar a voluntad en Java regex.
Parece que quieres algo como esto:
System.out.println(
"Have a meRry MErrY Christmas ho Ho hO"
.replaceAll("(?i)\\b(\\w+)(\\s+\\1)+\\b", "$1")
);
// Have a meRry Christmas ho
Tenga en cuenta que la bandera incrustada no lo Pattern.CASE_INSENSITIVE
es . Tenga en cuenta también que se ha eliminado uno superfluo del patrón.(?i)
\?i
\b
Se (?i)
coloca al principio del patrón para permitir la insensibilidad a mayúsculas y minúsculas. En este caso particular, no se anula más adelante en el patrón, por lo que, en efecto, todo el patrón no distingue entre mayúsculas y minúsculas.
Vale la pena señalar que, de hecho, puede limitar la insensibilidad a mayúsculas y minúsculas a solo partes del patrón completo. Por lo tanto, la cuestión de dónde colocarlo realmente depende de la especificación (aunque para este problema en particular no importa ya que no \w
distingue entre mayúsculas y minúsculas.
Para demostrarlo, aquí hay un ejemplo similar de colapsar series de letras como "AaAaaA"
simplemente "A"
.
System.out.println(
"AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
.replaceAll("(?i)\\b([A-Z])\\1+\\b", "$1")
); // A e I O u
Ahora suponga que especificamos que la ejecución solo debe colapsarse solo si comienza con una letra mayúscula. Luego debemos poner el (?i)
en el lugar apropiado:
System.out.println(
"AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
.replaceAll("\\b([A-Z])(?i)\\1+\\b", "$1")
); // A eeEeeE I O uuUuUuu
De manera más general, puede habilitar y deshabilitar cualquier indicador dentro del patrón como desee.
Ver también
Preguntas relacionadas