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).
Vordefinierte Zeichenklassen
Die Klassen-APIPattern
enthält vordefinierte Zeichenklassen, die praktische Verknüpfungen zu häufig verwendeten regulären Ausdrücken bieten. In dieser Tabelle sind die Konstrukte in der linken Spalte Kurzdarstellungen der Ausdrücke in der rechten Spalte. Bedeutet beispielsweise \d
eine Zahl (0-9), \w
bedeutet 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 \Q
und \E
sie 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 \d
ein 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: In 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
Mit 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: Im 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: Alle 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“: Regulä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“: Das 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: Der 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: Um 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: In 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.
GO TO FULL VERSION