Tak, niewrażliwość na wielkość liter można dowolnie włączać i wyłączać w wyrażeniu regularnym Java.
Wygląda na to, że chcesz coś takiego:
System.out.println(
"Have a meRry MErrY Christmas ho Ho hO"
.replaceAll("(?i)\\b(\\w+)(\\s+\\1)+\\b", "$1")
);
// Have a meRry Christmas ho
Zauważ, że flaga osadzenia nie Pattern.CASE_INSENSITIVEjest . Zwróć także uwagę, że jeden zbędny został usunięty ze wzoru.(?i)\?i\b
Znak (?i)jest umieszczony na początku wzoru, aby umożliwić niewrażliwość na wielkość liter. W tym konkretnym przypadku nie jest on nadpisywany później we wzorcu, więc w efekcie w całym wzorcu nie jest rozróżniana wielkość liter.
Warto zauważyć, że w rzeczywistości można ograniczyć niewrażliwość na wielkość liter tylko do części całego wzoru. Zatem pytanie, gdzie to umieścić, tak naprawdę zależy od specyfikacji (chociaż w przypadku tego konkretnego problemu nie ma to znaczenia, ponieważ wielkość \wliter nie jest rozróżniana.
Aby zademonstrować, oto podobny przykład zwijania się ciągów liter, takich jak "AaAaaA"po prostu "A".
System.out.println(
"AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
.replaceAll("(?i)\\b([A-Z])\\1+\\b", "$1")
); // A e I O u
Załóżmy teraz, że określimy, że przebieg powinien być zwinięty tylko wtedy, gdy zaczyna się od dużej litery. Następnie musimy umieścić (?i)w odpowiednim miejscu:
System.out.println(
"AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
.replaceAll("\\b([A-Z])(?i)\\1+\\b", "$1")
); // A eeEeeE I O uuUuUuu
Mówiąc bardziej ogólnie, możesz włączać i wyłączać dowolną flagę we wzorcu, jak chcesz.
Zobacz też
Powiązane pytania