PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Holen Sie sich die zweite Übereinstimmung aus den Ergebnissen von regexp_matches

Sie könnten REGEXP_REPLACE verwenden :

SELECT REGEXP_REPLACE('1234567 - 7654321 - some - more - text', '^\d+[^\d]+(\d+).*$', '\1');

Ausgabe

7654321

Dieser reguläre Ausdruck sucht nach einer Zeichenfolge, die mit einer bestimmten Anzahl von Ziffern beginnt (^\d+ ) gefolgt von einigen nicht-stelligen Zeichen ([^\d]+ ) und dann eine weitere Zifferngruppe ((\d+) ) gefolgt von einigen Zeichen bis zum Ende der Zeichenfolge (.*$ ). Der () um die zweite Zifferngruppe herum ergibt sich daraus eine einfangende Gruppe, auf die wir dann im Ersetzungsstring mit \1 verweisen können . Seit REGEXP_REPLACE nur die Teile des Strings ersetzt, die mit der Regex übereinstimmen, ist es notwendig, eine Regex zu haben, die mit dem Ganzen übereinstimmt string, um sie nur durch die gewünschten Daten zu ersetzen.

Aktualisieren

Wenn möglicherweise Zeichen vor dem ersten Ziffernsatz stehen, sollten Sie die Regex in

ändern
^[^\d]*\d+[^\d]+(\d+).*$

Aktualisierung 2

Wenn es möglich ist, dass am Anfang nur eine Zahlengruppe steht, müssen wir das Abgleichen des ersten Teils optional machen. Wir können das mit einer nicht einfangenden Gruppe tun:

^[^\d]*(?:\d+[^\d]+)?(\d+).*$

Dadurch wird die Übereinstimmung mit dem ersten Ziffernsatz optional, sodass die Regex trotzdem übereinstimmt, wenn sie nicht existiert (d. h. es gibt nur einen Ziffernsatz). Durch die Verwendung einer nicht einfangenden Gruppe (Hinzufügen des ?: zum Anfang der Gruppe müssen wir die Ersetzungszeichenfolge von \1 nicht ändern . SQLFiddle aktualisiert