JavaRush /Java-Blog /Random-DE /Grundlagen regulärer Ausdrücke in Java. Teil 3
articles
Level 15

Grundlagen regulärer Ausdrücke in Java. Teil 3

Veröffentlicht in der Gruppe Random-DE
Lassen Sie uns unser Studium der regulären Ausdrücke fortsetzen. In diesem Artikel befassen wir uns mit vordefinierten Zeichenklassen sowie der Quantifizierung (Suche nach Sequenzen). Grundlagen regulärer Ausdrücke in Java.  Teil 3 - 1

Vordefinierte Zeichenklassen

Die Klassen-API Patternenthält vordefinierte Zeichenklassen, die praktische Verknüpfungen zu häufig verwendeten regulären Ausdrücken bieten. Grundlagen regulärer Ausdrücke in Java.  Teil 3 - 2In dieser Tabelle sind die Konstrukte in der linken Spalte Kurzdarstellungen der Ausdrücke in der rechten Spalte. Bedeutet beispielsweise \deine Zahl (0-9), \wbedeutet einen Groß- oder Kleinbuchstaben, einen Unterstrich oder eine Zahl). Verwenden Sie nach Möglichkeit vordefinierte Zeichenklassen. Dadurch wird Ihr Code leichter lesbar und Fehler können behoben werden. Konstrukte, die mit einem Backslash beginnen, werden als Escape oder Protected bezeichnet. In früheren Artikeln haben wir bereits darüber gesprochen, Sonderzeichen mit Backslashes oder Symbolen zu maskieren \Qund \Esie als reguläre Zeichen zu verwenden. Wenn Sie einen Backslash mit regulären Zeichen (Literalen) verwenden, müssen Sie den Backslash maskieren, damit der Ausdruck kompiliert werden kann.
private final String REGEX = "\\d"; // цифра
In diesem Beispiel \dein regulärer Ausdruck; Der zusätzliche Backslash ist für die Kompilierung des Programms erforderlich. Unser Testprogramm liest reguläre Ausdrücke direkt von der Konsole, sodass kein zusätzlicher Schrägstrich erforderlich ist. Das folgende Beispiel demonstriert die Verwendung vordefinierter Zeichenklassen: Grundlagen regulärer Ausdrücke in Java.  Teil 3 - 3Grundlagen regulärer Ausdrücke in Java.  Teil 3 - 4In den ersten drei Beispielen ist der reguläre Ausdruck einfach „ .“ (das Punkt-Sonderzeichen), was ein beliebiges Zeichen bedeutet. Daher war die Suche in allen Fällen erfolgreich. Andere Beispiele verwenden vordefinierte Zeichenklassen, deren Bedeutung wir in der obigen Tabelle besprochen haben.

Quantifizierer

Grundlagen regulärer Ausdrücke in Java.  Teil 3 - 4Mit Quantifizierern können Sie die Häufigkeit des Vorkommens eines Zeichens in einer Zeichenfolge angeben. Schauen wir uns die Feinheiten der Funktionsweise gieriger, fauler und sehr gieriger Quantoren genauer an. Auf den ersten Blick mag es scheinen, dass die Quantoren X?, X?? und X?+ funktionieren auf die gleiche Weise: „X ist einmal vorhanden oder überhaupt nicht.“ Es gibt geringfügige Unterschiede in der Implementierung dieser Quantoren, auf die wir im Folgenden eingehen werden.

Übereinstimmungen mit der Länge Null

Beginnen wir mit dem Gierigen. Schreiben wir drei verschiedene reguläre Ausdrücke: den Buchstaben „a“ mit den Sonderzeichen ?, * oder +. Mal sehen, was passiert, wenn wir diese regulären Ausdrücke auf einer leeren Zeile testen: Grundlagen regulärer Ausdrücke in Java.  Teil 3 - 5Im obigen Beispiel war die Suche in den ersten beiden Fällen erfolgreich, da die Ausdrücke a? und a* ermöglichen, dass das Zeichen a in der Zeichenfolge fehlt. Beachten Sie außerdem, dass der Start- und der letzte Übereinstimmungsindex gleich sind (0). Da der Eingabestring keine Länge hat, findet das Programm an der ersten Position nichts :). Dieser Fall wird als Übereinstimmung mit der Länge Null bezeichnet. Solche Übereinstimmungen treten in mehreren Fällen auf: wenn die Eingabezeile leer ist, am Anfang der Eingabezeile, nach dem letzten Zeichen der Zeile oder zwischen Zeichen in der Zeile. Übereinstimmungen mit der Länge Null sind leicht zu erkennen: Sie beginnen und enden an derselben Position. Schauen wir uns einige weitere Beispiele für Übereinstimmungen mit der Länge Null an. Lassen Sie uns Übereinstimmungen mit der Länge Null anhand einiger weiterer Beispiele untersuchen. Ändern wir die Eingabezeichenfolge in das Zeichen „a“ und beobachten einen interessanten Effekt: Grundlagen regulärer Ausdrücke in Java.  Teil 3 - 6Alle drei Quantifizierer fanden das Zeichen „a“, aber die ersten beiden, die das Fehlen eines Zeichens berücksichtigen, fanden an Position 1 eine Übereinstimmung mit der Länge Null - nach dem letzten Zeichen der Zeichenfolge. Dies geschieht, weil das Programm das Zeichen „a“ als Zeichenfolge behandelt und es „durchläuft“, bis es keine Übereinstimmungen mehr gibt. Abhängig vom verwendeten Quantifizierer findet das Programm „nichts“ am Ende der Zeichenfolge oder auch nicht. Jetzt ändern wir die Eingabezeichenfolge in eine Folge von fünf Buchstaben „a“: Grundlagen regulärer Ausdrücke in Java.  Teil 3 - 7Regulärer Ausdruck a? findet für jeden Buchstaben in der Zeichenfolge separat eine Übereinstimmung. Der Ausdruck a* findet zwei Übereinstimmungen: die Zeichenfolge „a“‘ und eine Übereinstimmung mit der Länge Null an Position 5. Und schließlich findet der reguläre Ausdruck a+ nur die Zeichenfolge „a“, ohne „nichts“ zu finden :) Was passiert, wenn eine Zeichenfolge mit verschiedenen Zeichen als Eingabe angegeben wird? Beispiel: „ababaaaab“: Grundlagen regulärer Ausdrücke in Java.  Teil 3 - 8Das Zeichen „b“ befindet sich an den Positionen 1, 3 und 8 und das Programm findet an diesen Positionen Übereinstimmungen mit der Länge Null. Regulärer Ausdruck a? achtet nicht auf „b“, sondern sucht lediglich nach der Anwesenheit (oder Abwesenheit) des Zeichens „a“. Wenn der Quantifizierer das Fehlen von „a“ zulässt, werden alle Zeichen in der Zeichenfolge außer „a“ als Übereinstimmung mit der Länge Null angezeigt. Um Sequenzen einer bestimmten Länge zu finden, geben Sie einfach die Länge in geschweiften Klammern an: Grundlagen regulärer Ausdrücke in Java.  Teil 3 - 9Der reguläre Ausdruck a{3} sucht nach einer Sequenz aus drei „a“-Zeichen. In der ersten Zeile wurde nichts gefunden, da nicht genügend A in der Zeile vorhanden waren. Der zweite enthält 3 Zeichen, die das Programm findet. Der dritte Test findet auch eine Übereinstimmung am Anfang der Zeichenfolge. Alles nach dem 3. Zeichen erfüllt nicht den regulären Ausdruck, im folgenden Code ist dies der Fall und es wird mehrere Übereinstimmungen geben: Grundlagen regulärer Ausdrücke in Java.  Teil 3 - 10Um die minimale Sequenzlänge anzugeben, verwenden Sie:
Enter your regex: a{3,}
Enter input string to search: aaaaaaaaa
I found the text "aaaaaaaaa" starting at index 0 and ending at index 9.
In diesem Beispiel findet das Programm nur eine Übereinstimmung, da die Zeichenfolge die Mindestsequenzlängenanforderung von (3) „a“-Zeichen erfüllt. Zum Schluss noch die maximale Sequenzlänge festlegen: Grundlagen regulärer Ausdrücke in Java.  Teil 3 - 11In diesem Beispiel endete der erste Treffer beim sechsten Zeichen. Der zweite Treffer enthält Zeichen nach dem sechsten, weil Sie erfüllen die Mindestlängenanforderung. Wäre die Zeichenfolge ein Zeichen kürzer, gäbe es keine zweite Übereinstimmung.

Verwendung von Zeichengruppen und Klassen mit Quantoren

Bisher haben wir Quantifizierer an Zeichenfolgen getestet, die dasselbe Zeichen enthalten. Quantifizierer gelten nur für ein einzelnes Zeichen, sodass der reguläre Ausdruck „abc+“ ein- oder mehrmals mit Zeichenfolgen übereinstimmt, die „ab“ und „c“ enthalten. Es wird nicht ein- oder mehrmals „abc“ bedeuten. Aber Quantoren können in Verbindung mit Gruppen und Zeichenklassen verwendet werden, wie zum Beispiel [abc]+ (a oder b oder c, einmal oder mehrmals) oder (abc)+ („abc“ einmal oder mehrmals). Suchen wir eine Gruppe von Zeichen (Hund) dreimal in einer Zeile: Grundlagen regulärer Ausdrücke in Java.  Teil 3 - 12Im ersten Beispiel findet das Programm eine Übereinstimmung, weil Der Quantor erstreckt sich auf eine Gruppe von Zeichen. Wenn Sie die Klammern entfernen, gilt der Quantor {3} nur für den Buchstaben „g“. Sie können Quantoren auch mit Zeichenklassen verwenden: Grundlagen regulärer Ausdrücke in Java.  Teil 3 - 13Der Quantor {3} gilt im ersten Beispiel für die Zeichenklasse in Klammern und im zweiten nur für das Zeichen „c“.

Unterschiede zwischen gierigen, faulen und übergierigen Quantoren

Es gibt geringfügige Unterschiede zwischen gierigen, widerstrebenden und besitzergreifenden Quantoren. Greedy-Quantoren werden so genannt, weil sie versuchen, eine möglichst lange Übereinstimmung zu finden: Das Programm versucht zunächst, die gesamte Zeichenfolge zu „fressen“. Wenn keine Übereinstimmung gefunden wird, wird ein Zeichen verworfen und die Suche wiederholt, bis eine Übereinstimmung gefunden wird Es bleiben keine Zeichen mehr übrig. Faule Leute hingegen beginnen am Anfang der Zeile und fügen Zeichen für Zeichen hinzu, bis sie eine Übereinstimmung finden. Schließlich scannt die eifersüchtige Quantifizierung die gesamte Zeichenfolge einmal, ohne Zeichen wie bei Greedy zu entfernen. Zur Demonstration verwenden wir die Zeichenfolge xfooxxxxxxfoo. Grundlagen regulärer Ausdrücke in Java.  Teil 3 - 14Das erste Beispiel verwendet den gierigen Quantifizierer .*, um ein beliebiges Zeichen zu finden, 0 oder öfter, gefolgt von den Zeichen „f“, „o“ „o“. Da der Cantifier gierig ist, enthält die gefundene Übereinstimmung die gesamte Zeichenfolge. Ein gieriger Quantifizierer findet nicht alle Übereinstimmungen in einer Zeichenfolge, weil Im ersten Schritt wird nach dem Scannen der gesamten Zeichenfolge eine Übereinstimmung gefunden und der Job abgeschlossen. Das zweite Beispiel ist faul und beginnt am Anfang der Zeile und fügt Zeichen für Zeichen hinzu. Das Programm beginnt mit der Prüfung auf „Leerheit“, aber seitdem die Sequenz „foo“ nicht am Anfang der Zeile steht, wird die Suche mit der Hinzufügung des Zeichens „x“ fortgesetzt, danach wird die erste Übereinstimmung zwischen den Indizes 0 und 4 gefunden. Die Suche wird bis zum Ende der Zeile fortgesetzt und die zweite Übereinstimmung wird zwischen den Indizes 4 und 13 gefunden. Das dritte Beispiel findet keine Zufälle, da der Quantor eifersüchtig ist. In diesem Fall „fraß“ der reguläre Ausdruck .*+ die gesamte Zeile und ließ nichts für „foo“ übrig. Verwenden Sie den eifersüchtigen Quantifizierer, wenn Sie alles Unnötige in einer Zeichenfolge verwerfen müssen. Er ist effektiver als der entsprechende gierige Quantifizierer. Das ist alles! Link zur Quelle: Grundlagen regulärer Ausdrücke in Java. Teil 3
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION