Java RegEx non fa distinzione tra maiuscole e minuscole?


111

In Java, quando si esegue un replaceAll per cercare un pattern regex come:

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

(per rimuovere parole duplicate consecutive senza distinzione tra maiuscole e minuscole, ad esempio Test test), non sono sicuro di dove ho inserito il file ?i. Ho letto che dovrebbe essere all'inizio, ma se lo tolgo, rilevo parole consecutive duplicate (ad esempio test test), ma non parole senza distinzione tra maiuscole e minuscole (ad esempio Test test). Quindi ho pensato di poter aggiungere la? I all'inizio, ma non sembra che il lavoro sia fatto. qualche idea? Grazie!


Risposte:


119

RegexBuddy mi sta dicendo che se vuoi includerlo all'inizio, questa è la sintassi corretta:

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

168

Puoi anche abbinare espressioni regolari senza distinzione tra maiuscole e minuscole e renderle più leggibili utilizzando la costante Pattern.CASE_INSENSITIVE come:

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

2
Mmmm ... operazioni OR bit per bit incluse ...Pattern.compile(myregex, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)
Nick Grealy

4
Questo è molto più leggibile di questa (?i)cosa, le
espressioni regolari

Questa è la stessa risposta della risposta di relet 4 anni prima, ma ottiene tutti i voti. Dispari.
Zoomzoom

@Zoomzoom, non era quando l'ho scritto :) se controlli la cronologia dell'edizione di relet, vedi che è cambiato in questo nel 2018 stackoverflow.com/posts/3436124/…
Christian Vielma

126

Sì, l'insensibilità alle maiuscole può essere abilitata e disabilitata a piacimento in Java regex.

Sembra che tu voglia qualcosa del genere:

    System.out.println(
        "Have a meRry MErrY Christmas ho Ho hO"
            .replaceAll("(?i)\\b(\\w+)(\\s+\\1)+\\b", "$1")
    );
    // Have a meRry Christmas ho

Nota che il file embedded Pattern.CASE_INSENSITIVE flag(?i) non lo è \?i. Nota anche che un superfluo \bè stato rimosso dal modello.

Il (?i)è posto all'inizio del pattern per abilitare la distinzione tra maiuscole e minuscole. In questo caso particolare, non viene sovrascritto successivamente nel pattern, quindi in effetti l'intero pattern non fa distinzione tra maiuscole e minuscole.

Vale la pena notare che in effetti è possibile limitare l'insensibilità al maiuscolo / minuscolo solo a parti dell'intero pattern. Quindi, la domanda su dove metterlo dipende davvero dalle specifiche (sebbene per questo particolare problema non abbia importanza poiché non \wfa distinzione tra maiuscole e minuscole.

Per dimostrare, ecco un esempio simile di collasso di sequenze di lettere come "AaAaaA"solo "A".

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

Supponiamo ora di specificare che la sequenza deve essere compressa solo se inizia con una lettera maiuscola. Quindi dobbiamo mettere il (?i)nel posto appropriato:

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

Più in generale, puoi abilitare e disabilitare qualsiasi flag all'interno del pattern come desideri.

Guarda anche

Domande correlate


36

Se l'intera espressione non fa distinzione tra maiuscole e minuscole, puoi semplicemente specificare il CASE_INSENSITIVEflag:

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)

Grazie per la risposta. Questo è esattamente quello che stavo cercando. In Python abbiamo re.IGNORECASE che cercava una risposta simile in JAVA.
Doogle

0

Puoi anche portare la tua stringa iniziale, che controllerai per la corrispondenza del modello, in minuscolo. E usa rispettivamente i simboli minuscoli nel tuo modello.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.