¿Java RegEx no distingue entre mayúsculas y minúsculas?

En Java, al hacer un replaceAll para buscar un patrón de expresiones regulares como:

replaceAll("\\?i\\b(\\w+)\\b(\\s+\\1)+\\b", "$1"); 

(para eliminar palabras duplicadas que no distinguen entre mayúsculas y minúsculas, p. ej. prueba de prueba), no estoy seguro de dónde coloqué el? i. Leí que se supone que está al principio, pero si lo saco, capturo palabras consecutivas duplicadas (por ejemplo, prueba de prueba), pero no palabras que no distinguen entre mayúsculas y minúsculas (por ejemplo, prueba de prueba). Así que pensé que podría agregar el “i” al principio, pero eso no parece hacer el trabajo. ¿Alguna idea? ¡Gracias!

RegexBuddy me dice que si quieres incluirlo al principio, esta es la syntax correcta:

 "(?i)\\b(\\w+)\\b(\\s+\\1)+\\b" 

Sí, la insensibilidad de 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 el indicador Pattern.CASE_INSENSITIVE incrustado es (?i) not \?i Tenga en cuenta también que uno superfluo \b ha sido eliminado del patrón.

El (?i) se coloca al comienzo 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, el patrón completo 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 solo a 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 \w no distingue entre mayúsculas y minúsculas).

Para demostrarlo, "AaAaaA" aquí un ejemplo similar de corridas de letras colapsadas como "AaAaaA" a solo "A" .

  System.out.println( "AaAaaA eeEeeE IiiIi OoooOo uuUuUuu" .replaceAll("(?i)\\b([AZ])\\1+\\b", "$1") ); // A e IO u 

Ahora supongamos que especificamos que la ejecución solo debe colapsarse si comienza con una letra mayúscula. Entonces debemos poner el (?i) en el lugar apropiado:

  System.out.println( "AaAaaA eeEeeE IiiIi OoooOo uuUuUuu" .replaceAll("\\b([AZ])(?i)\\1+\\b", "$1") ); // A eeEeeE IO uuUuUuu 

De manera más general, puede activar y desactivar cualquier bandera dentro del patrón como lo desee.

Ver también

  • java.util.regex.Pattern
  • regular-expressions.info/Modifiers
    • Especificación de modos dentro de la expresión regular
      • En lugar de /regex/i ( Pattern.CASE_INSENSITIVE en Java), puede hacer /(?i)regex/
    • Encendido y apagado de modos solo para parte de la expresión regular
      • También puede hacer /first(?i)second(?-i)third/
    • Tramos de modificador
      • También puede hacer /first(?i:second)third/
  • regular-expressions.info/Word Boundaries (siempre hay un \b entre un \w y un \s )

Preguntas relacionadas

  • ¿Puedes hacer solo parte de una expresión regular sin distinguir entre mayúsculas y minúsculas?
  • Case sensible e insensible en el mismo patrón

También puede hacer coincidir las expresiones regulares insensibles a mayúsculas y minúsculas y hacerlo más legible utilizando la constante Pattern.CASE_INSENSITIVE como:

 Pattern mypattern = Pattern.compile(MYREGEX, Pattern.CASE_INSENSITIVE); Matcher mymatcher= mypattern.matcher(mystring); 

Si su expresión completa no distingue entre mayúsculas y minúsculas, puede especificar el indicador CASE_INSENSITIVE :

 Pattern.compile(regexp, Pattern.CASE_INSENSITIVE) 

También puede llevar su cadena inicial, que va a verificar para la coincidencia de patrones, a minúsculas. Y use en su patrón símbolos en minúscula, respectivamente.