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

111

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 consecutivas que no distinguen entre mayúsculas y minúsculas, por ejemplo, prueba de prueba), no estoy seguro de dónde puse 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!

Cristal
fuente
Mira

Respuestas:

119

RegexBuddy me dice que si desea incluirlo al principio, esta es la sintaxis correcta:

"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"
cnanney
fuente
167

También puede hacer coincidir expresiones regulares que no distinguen entre mayúsculas y minúsculas y hacerlas más legibles utilizando la constante Pattern.CASE_INSENSITIVE como:

Pattern mypattern = Pattern.compile(MYREGEX, Pattern.CASE_INSENSITIVE);
Matcher mymatcher= mypattern.matcher(mystring);
Christian Vielma
fuente
2
Mmmm ... operaciones OR inclusivas bit a bit ...Pattern.compile(myregex, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)
Nick Grealy
4
Esto es mucho más legible que esto (?i), las expresiones regulares de Java ya eran bastante ilegibles: S
Bartek Banachewicz
Esta es la misma respuesta que la respuesta de Relet 4 años antes, pero obtiene todos los votos. Impar.
Zoomzoom
@Zoomzoom, no fue cuando lo escribí :) si revisas el historial de ediciones de relet, ves que cambió a esto en 2018 stackoverflow.com/posts/3436124/…
Christian Vielma
126

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_INSENSITIVEes . 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 \wdistingue 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

  • java.util.regex.Pattern
  • regular-expressions.info/Modifiers
    • Especificar modos dentro de la expresión regular
      • En lugar de /regex/i( Pattern.CASE_INSENSITIVEen Java), puede hacer/(?i)regex/
    • Activación y desactivación de modos solo para una parte de la expresión regular
      • Tu tambien puedes hacer /first(?i)second(?-i)third/
    • Intervalos de modificadores
      • Tu tambien puedes hacer /first(?i:second)third/
  • regular-expressions.info/Word Boundary (siempre hay un \bentre a \wy a \s)

Preguntas relacionadas

poligenelubricantes
fuente
36

Si toda su expresión no distingue entre mayúsculas y minúsculas, puede especificar la CASE_INSENSITIVEbandera:

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)
realquilar
fuente
Gracias por la respuesta. Esto es exactamente lo que estaba buscando. En python tenemos re.IGNORECASE estaba buscando una respuesta similar en JAVA.
Doogle
0

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.

Alexander Drobyshevsky
fuente