2017-08-17 25 views
0

Hier ist meine hash:Extract letzte Instanz String von String

--- 
0: 
    id: 11259 
    year: 1997 
    status: other 
    priority: 
    created_at: !ruby/object:ActiveSupport::TimeWithZone 
    utc: 2017-01-13 15:02:22.000000000 Z 
    zone: !ruby/object:ActiveSupport::TimeZone 
     name: Etc/UTC 
    time: 2017-01-13 15:02:22.000000000 Z 
    updated_at: !ruby/object:ActiveSupport::TimeWithZone 
    utc: 2017-01-13 15:02:22.000000000 Z 
    zone: !ruby/object:ActiveSupport::TimeZone 
     name: Etc/UTC 
    time: 2017-01-13 15:02:22.000000000 Z 
1: 
    id: 82829 
    year: 1931 
    status: won 
    priority: 
    created_at: !ruby/object:ActiveSupport::TimeWithZone 
    utc: 2017-01-13 15:02:22.000000000 Z 
    zone: !ruby/object:ActiveSupport::TimeZone 
     name: Etc/UTC 
    time: 2017-01-13 15:02:22.000000000 Z 
    updated_at: !ruby/object:ActiveSupport::TimeWithZone 
    utc: 2017-01-13 15:02:22.000000000 Z 
    zone: !ruby/object:ActiveSupport::TimeZone 
     name: Etc/UTC 
    time: 2017-01-13 15:02:22.000000000 Z 

Ich möchte eines von zwei Dingen tun:

(1) Extrahieren Sie beide ‚ids

id: 11259 
id: 82829 

(2) Nur die letzte "ID" extrahieren:

id: 82829 

Bisher habe ich nur in der Lage sein, die erste ID zu extrahieren:

REGEXP_SUBSTR(hash_name, "id: .*?\n") 

Dank.

+0

Sind Sie sicher, dass Sie MySQL verwenden? Es hat keine 'REGEXP_SUBSTR()' Funktion. Diese Funktion existiert nur in Oracle und MariaDB. – Barmar

+0

MariaDB verwendet PCRE, Sie können also ein negatives Lookahead verwenden, um nach 'id: 'zu suchen, auf das später in der Zeichenfolge keine weitere' id:' folgt. Dann wird die letzte ID: in der Zeichenfolge übereinstimmen. – Barmar

Antwort

1

Wenn Sie eine MariaDB Version verwenden, die PCRE verwendet, können Sie eine negative Vorschau verwenden können nach dem Spiel id: auszuschließen.

REGEXP_SUBSTR(hash_name, '(?s)id:[^\n]+(?!.*id:)') 

(?s) legt es in DOTALL Modus, so dass .* Matches über mehrere Zeilen. (?!.*id:) ist ein negativer Lookahead, der eine Übereinstimmung nicht zulässt, wenn sie von allem gefolgt wird, das id: enthält. Und id:[^\n]* entspricht id: gefolgt von optional etwas bis zu einem Newline.

DEMO

+0

Perfekt, danke @Barmar – huey

+0

Wenn es das Problem gelöst hat, sollten Sie die Antwort akzeptieren – Barmar

0

diese user defined function Versuchen, die den Zugang bieten Perl regex:

PREG_CAPTURE(pattern, subject [, capture-group] [, occurence]) 

EDIT:

PREG_CAPTURE("(?s)id:[^\n]+(?!.*id:)", hash_name) 
+0

Wie würden Sie das verwenden, um das letzte Vorkommen von etwas zu finden, das sich beliebig oft wiederholt? – Barmar

+0

"erfassen Sie einen benannten oder numerischen eingeklammerten Teilausdruck aus einem pcre-Muster. Capture von einer bestimmten Übereinstimmung der Regex oder die erste Übereinstimmung ist Vorkommen nicht angegeben." –

+0

Das beantwortet meine Frage nicht. Wie würden Sie eine Regexp erstellen, die einer beliebigen Anzahl von Gruppen entsprechen kann, und wie würden Sie dann wissen, welche Nummer des Vorkommens die letzte ist? – Barmar