Muster (Java Platform SE 7)

Eine kompilierte Darstellung eines regulären Ausdrucks.

Ein regulärer Ausdruck, der als Zeichenfolge angegeben wird, muss zuerst in eine Instanz dieser Klasse kompiliert werden. Das resultierende Muster kann dann verwendet werden, um ein Matcher -Objekt zu erstellen, das mit beliebigen -Zeichensequenzen gegen den regulären Ausdruck. Der gesamte Status, der an der Durchführung eines Matchs beteiligt ist, befindet sich im Matcher, sodass viele Matcher dasselbe Muster verwenden können.

Eine typische Aufrufsequenz ist somit

 Pattern p = Pattern.
("a*b"); Matcher m = p.
("aaaaab"); boolean b = m.
();

Eine matches -Methode wird von dieser Klasse als Annehmlichkeit definiert, wenn ein regulärer Ausdruck nur einmal verwendet wird. Diese Methode kompiliert einen Ausdruck und vergleicht eine Eingabesequenz in einem einzigen Aufruf damit. Die Anweisung

 boolean b = Pattern.matches("a*b", "aaaaab");

entspricht den drei obigen Anweisungen. Bei wiederholten Übereinstimmungen ist dies jedoch weniger effizient, da das kompilierte Muster nicht wiederverwendet werden kann.

Instanzen dieser Klasse sind unveränderlich und können von mehreren gleichzeitigen Threads verwendet werden. Instanzen der Klasse Matcher sind für eine solche Verwendung nicht sicher.

Zusammenfassung der Konstrukte mit regulären Ausdrücken

Backslashes, Escapezeichen und Anführungszeichen

Das Backslash-Zeichen („\“) dient zur Einführung von Escape-Konstrukten, wie in definiert die obige Tabelle sowie Zeichen, die ansonsten als nicht entflohene Konstrukte interpretiert würden. Somit entspricht der Ausdruck \\ einem einzelnen Backslash und \ {einer linken Klammer.

Es ist ein Fehler, vor einem alphabetischen Zeichen, das kein maskiertes Konstrukt kennzeichnet, einen Backslash zu verwenden. Diese sind für zukünftige Erweiterungen der Sprache für reguläre Ausdrücke reserviert. Ein Backslash kann vor einem nicht alphabetischen Zeichen verwendet werden, unabhängig davon, ob dieses Zeichen Teil eines nicht entflohenen Konstrukts ist.

Backslashes in String-Literalen im Java-Quellcode werden gemäß den Anforderungen der Java ™ -Sprachenspezifikation als Unicode-Escapezeichen (Abschnitt 3.3) oder andere Zeichen-Escapezeichen (Abschnitt 3.10.6) interpretiert. Es ist daher erforderlich, Backslashes zu verdoppeln in Zeichenfolgenliteralen, die reguläre Ausdrücke darstellen, um sie vor der Interpretation durch den Java-Bytecode-Compiler zu schützen. Das Zeichenfolgenliteral „\ b“ entspricht beispielsweise einem einzelnen Rücktastezeichen, wenn es als regulärer Ausdruck interpretiert wird, während „\\ b“ einer Wortgrenze entspricht. Das Zeichenfolgenliteral „\ (Hallo \)“ ist unzulässig und führt zu einem Fehler bei der Kompilierung. Um mit der Zeichenfolge (Hallo) übereinzustimmen, muss das Zeichenfolgenliteral „\\ (Hallo \\)“ verwendet werden.

Zeichenklassen

Zeichenklassen können in anderen Zeichenklassen auftreten und aus dem Vereinigungsoperator (implizit) und dem Schnittpunktoperator (& &). Der Vereinigungsoperator bezeichnet eine Klasse, die jedes Zeichen enthält, das sich in mindestens einer seiner Operandenklassen befindet. Der Schnittpunktoperator bezeichnet eine Klasse, die jedes Zeichen enthält, das sich in beiden Operandenklassen befindet.

Die Rangfolge der Zeichenklassenoperatoren ist vom höchsten zum niedrigsten:

1 Literale Flucht \ x
2 Gruppierung
3 Bereich az
4 Union
5 Kreuzung ]

Beachten Sie, dass innerhalb einer Zeichenklasse ein anderer Satz von Metazeichen wirksam ist als außerhalb von a Zeichenklasse. Zum Beispiel der reguläre Ausdruck. verliert seine besondere Bedeutung innerhalb einer Zeichenklasse, während der Ausdruck – ein Bereich wird, der Metazeichen bildet.

Zeilenabschlüsse

Ein Zeilenabschluss ist eine ein- oder zweistellige Folge, die das Ende einer Zeile der Eingabezeichenfolge markiert. Folgendes wird als Zeilenabschlusszeichen erkannt:

Wenn der Modus UNIX_LINES aktiviert ist, werden nur Zeilenumbrüche als Zeilenumbrüche erkannt.

Der reguläre Ausdruck. Entspricht einem beliebigen Zeichen außer einem Zeilenabschluss, sofern nicht das Flag DOTALL angegeben ist.

Standardmäßig ignorieren die regulären Ausdrücke ^ und $ Zeilenabschlüsse und stimmen nur am Anfang bzw. am Ende der gesamten Eingabesequenz überein. Wenn der Modus MULTILINE aktiviert ist, stimmt ^ am Anfang der Eingabe und nach jedem Zeilenabschluss außer am Ende der Eingabe überein. Im MULTILINE -Modus stimmt $ unmittelbar vor einem Zeilenabschluss oder dem Ende der Eingabesequenz überein.

Gruppen und Erfassung

Gruppennummer

Erfassungsgruppen werden nummeriert, indem ihre öffnenden Klammern von links nach rechts gezählt werden.In dem Ausdruck ((A) (B (C))) gibt es beispielsweise vier solche Gruppen:

1

((A) (B (C)))

2

(A)

3

(B (C))

4

(C)

Gruppe Null steht immer für den gesamten Ausdruck.

Erfassungsgruppen werden so benannt, weil während einer Übereinstimmung jede Teilsequenz der Eingabesequenz, die mit einer solchen Gruppe übereinstimmt, gespeichert wird. Die erfasste Teilsequenz kann später im Ausdruck über eine Rückreferenz verwendet werden und kann auch vom Matcher abgerufen werden, sobald der Matchvorgang abgeschlossen ist.

Gruppenname

Einer Erfassungsgruppe kann auch ein „Name“, eine benannte Erfassungsgruppe, zugewiesen und später durch den „Namen“ rückverweisen. Gruppennamen bestehen aus den folgenden Zeichen. Das erste Zeichen muss ein Buchstabe sein.

Eine Gruppe mit benannter Erfassung ist weiterhin wie unter Gruppennummer beschrieben nummeriert.

Die erfasste Eingabe, die einer Gruppe zugeordnet ist, ist immer die Teilsequenz, mit der die Gruppe zuletzt übereinstimmte. Wenn eine Gruppe aufgrund der Quantifizierung ein zweites Mal bewertet wird, bleibt der zuvor erfasste Wert, falls vorhanden, erhalten, wenn die zweite Bewertung fehlschlägt. Wenn Sie beispielsweise die Zeichenfolge „aba“ mit dem Ausdruck (a (b)?) + Abgleichen, bleibt Gruppe zwei auf „b“ gesetzt. Alle erfassten Eingaben werden zu Beginn jedes Spiels verworfen.

Gruppen, die mit (? beginnen, sind entweder reine, nicht erfassende Gruppen, die keinen Text erfassen und nicht zur Gruppensumme zählen, oder benannte Erfassungsgruppen.

Unicode-Unterstützung

Diese Klasse entspricht Stufe 1 des technischen Unicode-Standards Nr. 18: Regulärer Unicode-Ausdruck sowie RL2.1-Kanonische Äquivalente.

Unicode-Escape-Sequenzen wie \ u2014 im Java-Quellcode werden wie in Abschnitt 3.3 der Java ™ -Sprachenspezifikation beschrieben verarbeitet. Solche Escape-Sequenzen werden auch direkt vom Parser für reguläre Ausdrücke implementiert, sodass Unicode-Escape-Zeichen in Ausdrücken verwendet werden können, die aus Dateien oder von der Tastatur gelesen werden. \ u2014 „und“ \\ u2014 „werden, obwohl sie nicht gleich sind, in dasselbe Muster kompiliert, das dem Zeichen mit dem Hexadezimalwert 0x2014 entspricht.

Ein Unicode-Zeichen kann auch in einem regulären Ausdruck mithilfe von dargestellt werden seine Hex-Notation (hexadezimaler Codepunktwert) direkt wie in Konstrukt \ x {…} beschrieben, z Beispielsweise kann ein Zusatzzeichen U + 2011F als \ x {2011F} anstelle von zwei aufeinanderfolgenden Unicode-Escape-Sequenzen des Ersatzpaars \ uD840 \ uDD1F angegeben werden.

Unicode-Skripte, -Blöcke, -Kategorien und -Binäreigenschaften werden mit den Konstrukten \ p und \ P wie in Perl geschrieben. \ p {prop} stimmt überein, wenn die Eingabe die Eigenschaft prop hat, während \ P {prop} nicht übereinstimmt, wenn die Eingabe diese Eigenschaft hat.

Skripte, Blöcke, Kategorien und binäre Eigenschaften können sowohl innerhalb als auch außerhalb einer Zeichenklasse verwendet werden.

Skripte werden entweder mit dem Präfix Is wie in IsHiragana oder mit der script (oder seine Kurzform sc) wie in script=Hiragana oder sc=Hiragana.

Die von Pattern unterstützten Skriptnamen sind die gültigen Skriptnamen, die von UnicodeScript.forName akzeptiert und definiert werden.

Blöcke werden mit dem Präfix In wie in InMongolian oder mit dem Schlüsselwort block (oder seine Kurzform blk) wie in block=Mongolian oder blk=Mongolian.

Die von Pattern unterstützten Blocknamen sind die gültigen Blocknamen, die von UnicodeBlock.forName akzeptiert und definiert werden.

Kategorien können mit dem optionalen Präfix Is angegeben werden: Sowohl \p{L} als auch \p{IsL} bezeichnet die Kategorie der Unicode-Buchstaben. Wie Skripte und Blöcke können Kategorien auch mit dem Schlüsselwort general_category (oder seiner Kurzform gc) wie in general_category=Lu oder gc=Lu.

Die unterstützten Kategorien sind die des Unicode-Standards in der von der Klasse Character angegebenen Version. Die Kategorienamen sind die im Standard definierten, sowohl normativen als auch informativen.

Binäre Eigenschaften werden mit dem Präfix Is angegeben, wie in IsAlphabetic.Die von Pattern unterstützten binären Eigenschaften sind

  • alphabetisch
  • ideografisch
  • Buchstabe
  • Kleinbuchstaben
  • Großbuchstaben
  • Titelbuchstaben
  • Interpunktion
  • Steuerung
  • White_Space
  • Ziffer
  • Hex_Digit
  • Noncharacter_Code_Point
  • Zugewiesen

Vordefinierte Zeichenklassen und POSIX-Zeichenklassen entsprechen der Empfehlung von Anhang C: Kompatibilitätseigenschaften des regulären Unicode-Ausdrucks, wenn das Flag UNICODE_CHARACTER_CLASS angegeben ist.

Kategorien, die sich wie die booleschen ismethodname-Methoden von java.lang.Character verhalten (mit Ausnahme der veralteten), sind über dieselbe \ p {prop} -Syntax verfügbar, wobei die angegebene Eigenschaft den Namen javamethodname hat.

Vergleich mit Perl 5

Die Pattern Engine führt einen traditionellen NFA-basierten Abgleich mit geordnetem Wechsel durch, wie er in Perl 5 auftritt.

Perl-Konstrukte, die von dieser Klasse nicht unterstützt werden:

Von dieser Klasse unterstützte Konstrukte, jedoch nicht von Perl:

  • Vereinigung und Schnittmenge von Zeichenklassen wie beschrieben oben.

Bemerkenswerte Unterschiede zu Perl:

  • In Perl werden \ 1 bis \ 9 immer als Rückverweise interpretiert. Eine Backslash-Escape-Zahl größer als 9 wird als Back-Referenz behandelt, wenn mindestens so viele Unterausdrücke vorhanden sind. Andernfalls wird sie nach Möglichkeit als oktales Escape interpretiert. In dieser Klasse müssen oktale Escapezeichen immer mit einer Null beginnen. In dieser Klasse werden \ 1 bis \ 9 immer als Rückverweise interpretiert, und eine größere Zahl wird als Rückverweis akzeptiert, wenn an diesem Punkt im regulären Ausdruck mindestens so viele Unterausdrücke vorhanden sind, andernfalls werden vom Parser Ziffern bis zur Zahl gelöscht ist kleiner oder gleich der vorhandenen Anzahl von Gruppen oder es ist eine Ziffer.

  • Perl verwendet das g-Flag, um eine Übereinstimmung anzufordern, die dort fortgesetzt wird, wo die letzte Übereinstimmung aufgehört hat. Diese Funktionalität wird implizit von der Klasse Matcher bereitgestellt: Wiederholte Aufrufe der Methode find werden dort fortgesetzt, wo die letzte Übereinstimmung aufgehört hat, es sei denn, der Matcher wird zurückgesetzt.

  • In Perl wirken sich eingebettete Flags auf der obersten Ebene eines Ausdrucks auf den gesamten Ausdruck aus. In dieser Klasse werden eingebettete Flags immer an dem Punkt wirksam, an dem sie angezeigt werden, unabhängig davon, ob sie sich auf der obersten Ebene oder innerhalb einer Gruppe befinden. Im letzteren Fall werden die Flags am Ende der Gruppe wie in Perl wiederhergestellt.

Für eine genauere Beschreibung des Verhaltens von Konstrukten regulärer Ausdrücke siehe Mastering Regular Expressions, 3. Auflage, Jeffrey EF Friedl, O „Reilly and Associates, 2006.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.