Suche…


Grundlagen

Rückverweise werden verwendet, um denselben Text zu finden, der zuvor von einer Erfassungsgruppe abgeglichen wurde. Dies hilft sowohl bei der Wiederverwendung vorheriger Teile Ihres Musters als auch bei der Sicherstellung, dass zwei Teile einer Zeichenfolge übereinstimmen.

Wenn Sie beispielsweise überprüfen möchten, dass eine Zeichenfolge eine Ziffer von Null bis Neun hat, ein Trennzeichen, wie Bindestriche, Schrägstriche oder sogar Leerzeichen, ein Kleinbuchstabe, ein anderes Trennzeichen und dann eine andere Ziffer von Null bis Neun Verwenden Sie eine Regex wie folgt:

[0-9][-/ ][a-z][-/ ][0-9]

Dies würde 1-a-4 , aber auch 1-a/4 oder 1 a-4 . Wenn die Trennzeichen übereinstimmen sollen, können wir eine Erfassungsgruppe und eine Rückwärtsreferenz verwenden. Die Rückwärtsreferenz zeigt die Übereinstimmung der gefundenen Capture-Gruppe an und stellt sicher, dass die Position der Rückwärtsreferenz genau übereinstimmt.

Wenn wir dasselbe Beispiel verwenden, wird die Regex zu:

[0-9]([-/ ])[a-z]\1[0-9]

Das \1 bezeichnet die erste Erfassungsgruppe im Muster. Bei dieser kleinen Änderung stimmt der Regex nun mit 1-a-4 oder 1 a 4 überein, jedoch nicht mit 1 a-4 oder 1-a/4 .

Die Nummer, die für die Rückreferenz verwendet werden soll, hängt vom Speicherort Ihrer Capture-Gruppe ab. Die Anzahl kann zwischen eins und neun liegen und kann durch Zählen der Erfassungsgruppen ermittelt werden.

([0-9])([-/ ])[a-z][-/ ]([0-9])
|--1--||--2--|          |--3--|

Verschachtelte Erfassungsgruppen ändern diese Anzahl geringfügig. Sie zählen zunächst die äußere Capture-Gruppe, dann die nächste Ebene und fahren fort, bis Sie das Nest verlassen:

(([0-9])([-/ ]))([a-z])
 |--2--||--3--|
|-------1------||--4--|

Mehrdeutige Rückmeldungen

Problem: Sie müssen Text eines bestimmten Formats zuordnen, zum Beispiel:

1-a-0
6/p/0
4 g 0

Das ist eine Ziffer, ein Trennzeichen (eins von - , / oder ein Leerzeichen), ein Buchstabe, dasselbe Trennzeichen und eine Null.

Naive Lösung: Wenn Sie den Regex aus dem Basics-Beispiel anpassen, kommen Sie zu diesem Regex:

[0-9]([-/ ])[a-z]\10

Das funktioniert aber wahrscheinlich nicht. Die meisten regulären Ausdrücke unterstützen mehr als neun Erfassungsgruppen, und nur wenige sind klug genug, um zu erkennen, dass \10 , da es nur eine Erfassungsgruppe gibt, ein Rückverweis auf Gruppe 1 sein muss, gefolgt von einem Literal 0 . Die meisten Geschmacksrichtungen behandeln es als Rückverweis auf Gruppe 10. Einige davon lösen eine Ausnahme aus, da es keine Gruppe 10 gibt. der Rest wird einfach nicht passen.

Es gibt mehrere Möglichkeiten, dieses Problem zu vermeiden. Benutze Gruppen (und benannte Rückreferenzen):

[0-9](?<sep>[-/ ])[a-z]\k<sep>0

Wenn Ihre Regex-Sprache dies unterstützt, kann das Format \g{n} (wobei n eine Zahl ist) die Rückverweisnummer in geschweifte Klammern einschließen, um sie von den nachfolgenden Ziffern zu trennen:

[0-9]([-/ ])[a-z]\g{1}0

Eine andere Möglichkeit ist die Verwendung der erweiterten Regex-Formatierung, bei der die Elemente mit unbedeutendem Leerzeichen getrennt werden (in Java müssen Sie das Leerzeichen in den Klammern angeben):

(?x) [0-9] ([-/ ]) [a-z] \1 0

Wenn Ihr Regex-Aroma diese Funktionen nicht unterstützt, können Sie eine unnötige, aber harmlose Syntax hinzufügen, z. B. eine Gruppe ohne Capturing:

[0-9]([-/ ])[a-z](?:\1)0

... oder ein Dummy-Quantifizierer (dies ist möglicherweise der einzige Umstand, unter dem {1} nützlich ist):

[0-9]([-/ ])[a-z]\1{1}0


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow