Ist bei Java RegEx die Groß- und Kleinschreibung nicht zu beachten?

111

Wenn Sie in Java ein replaceAll ausführen, suchen Sie nach einem regulären Ausdrucksmuster wie:

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

(um doppelte aufeinanderfolgende Wörter zu entfernen, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird, z. B. Testtest), bin ich mir nicht sicher, wo ich das ablege ?i. Ich habe gelesen, dass es am Anfang sein soll, aber wenn ich es herausnehme, fange ich doppelte aufeinanderfolgende Wörter (z. B. Testtest), aber keine Wörter, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird (z. B. Testtest). Also dachte ich, ich könnte das? I am Anfang hinzufügen, aber das scheint den Job nicht zu erledigen. Irgendwelche Gedanken? Vielen Dank!

Kristall
quelle
Überprüfen Sie dies aus stackoverflow.com/a/55980176/3593084
Mr.Q

Antworten:

119

RegexBuddy sagt mir, wenn Sie es am Anfang einfügen möchten, ist dies die richtige Syntax:

"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"
cnanney
quelle
165

Mit der Konstante Pattern.CASE_INSENSITIVE können Sie auch Regexs ohne Berücksichtigung der Groß- und Kleinschreibung abgleichen und die Lesbarkeit verbessern.

Pattern mypattern = Pattern.compile(MYREGEX, Pattern.CASE_INSENSITIVE);
Matcher mymatcher= mypattern.matcher(mystring);
Christian Vielma
quelle
2
Mmmm .... bitweise inklusive ODER-Operationen ...Pattern.compile(myregex, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)
Nick Grealy
4
Dies ist viel besser lesbar als dieses (?i)Ding, Java-Regexe waren bereits ziemlich unlesbar: S
Bartek Banachewicz
Dies ist die gleiche Antwort wie die Antwort von relet vor 4 Jahren, erhält jedoch alle Stimmen. Seltsam.
Zoomzoom
@Zoomzoom, es war nicht der Zeitpunkt, an dem ich es geschrieben habe :) Wenn Sie den Verlauf der Relet-Ausgabe überprüfen, sehen Sie, dass er 2018 geändert wurde. Stackoverflow.com/posts/3436124/…
Christian Vielma
126

Ja, Groß- und Kleinschreibung kann in Java Regex nach Belieben aktiviert und deaktiviert werden.

Es sieht so aus, als ob Sie so etwas wollen:

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

Beachten Sie, dass das eingebettete Pattern.CASE_INSENSITIVE Flag (?i)nicht ist \?i. Beachten Sie auch, dass eine überflüssige \baus dem Muster entfernt wurde.

Das (?i)wird am Anfang des Musters platziert, um die Groß- und Kleinschreibung nicht zu berücksichtigen. In diesem speziellen Fall wird es später im Muster nicht überschrieben, sodass das gesamte Muster die Groß- und Kleinschreibung nicht berücksichtigt.

Es ist erwähnenswert, dass Sie die Groß- und Kleinschreibung in der Tat nur auf Teile des gesamten Musters beschränken können. Daher hängt die Frage, wo es platziert werden soll, wirklich von der Spezifikation ab (obwohl es für dieses spezielle Problem keine Rolle spielt, da \wdie Groß- und Kleinschreibung nicht berücksichtigt wird.

Um zu demonstrieren, hier ist ein ähnliches Beispiel von Läufen von Buchstaben wie kollabiert "AaAaaA"nur "A".

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

Nehmen wir nun an, wir geben an, dass der Lauf nur reduziert werden soll, wenn er mit einem Großbuchstaben beginnt. Dann müssen wir das (?i)an der richtigen Stelle platzieren:

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

Im Allgemeinen können Sie jedes Flag innerhalb des Musters nach Ihren Wünschen aktivieren und deaktivieren.

Siehe auch

Verwandte Fragen

Polygenschmierstoffe
quelle
36

Wenn bei Ihrem gesamten Ausdruck die Groß- und Kleinschreibung nicht berücksichtigt wird, können Sie einfach das CASE_INSENSITIVEFlag angeben :

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)
relet
quelle
Danke für die Antwort. Das ist genau das, wonach ich gesucht habe. In Python haben wir re.IGNORECASE nach einer ähnlichen Antwort in JAVA gesucht.
Doogle
0

Sie können auch Ihre anfängliche Zeichenfolge, die Sie auf Musterübereinstimmung prüfen, in Kleinbuchstaben führen. Und verwenden Sie in Ihrem Muster jeweils Kleinbuchstaben.

Alexander Drobyshevsky
quelle