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_INSENSITIVE
jest . 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ść \w
liter 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