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 \w
fa 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