2017-10-18 5 views
0

Ich versuche, eine bestimmte Zeichenfolge in Spalten in meiner Oracle-Tabelle über reguläre Ausdrücke zu analysieren, und ich bin sehr verwirrt durch die verschiedenen Beispiele online. Regulärer Ausdruck

Dies ist die Probe Zeichenfolge ich analysieren möchte (diese Zeichenfolge ist ein einzelner Wert in Spalte raw string aus Tabelle raw_string_table genannt):

Attributes : {} 
Body : { 
    "Type" : "TypeValue", 
    "MessageId" : "MessageIDValue", 
    "TopicArn" : "TopicArnValue", 
    "Message" : "MessageValue", 
    "Timestamp" : "TimestampValue", 
    "SignatureVersion" : "SignatureVersionValue", 
    "Signature" : "SignatureValue", 
    "SigningCertURL" : "SigningCertURLValue", 
    "UnsubscribeURL" : "UnsubscribeURLValue" 
} 
MD5OfBody : MD5OfBodyValue 

(Einrückungen zur besseren Lesbarkeit hinzugefügt)

Dies ist, was ich will mein Ergebnis zu setzen:

example result set

+0

Sieht aus wie ein schlechter Fall für Regex. Warum nicht 2 Listen aus ungeraden und geraden Teilen auswählen? – CAustin

+0

Sieht aus wie eine Gruppe von Schlüssel/Wert-Paaren. Sollte mit Regexes wie "key1" abgeglichen und abgefangen werden: "([^"] *) "," key2 ":" ([^ "] *)" ... '. Eigentlich sieht "Body" wie ein Json-Objekt aus. Haben Sie einen Parser? – PJProudhon

+0

Können Sie den Code ändern, der die Zeichenfolge erstellt, sodass ein Standardformat wie JSON verwendet wird? Dann können Sie eine JSON-Bibliothek zum Parsen verwenden. – Barmar

Antwort

0

Die einfachste Sache zu tun ist, ein regulärer Ausdruck für jeden Wert zu extrahieren Sie versuchen - diese Weise können Sie bei der Bestellung nicht abhängig sind:

SELECT REGEXP_SUBSTR(RAW_STRING, '"Type".*:.*"(.*)"', 1, 1, NULL, 1) AS TYPE, 
     REGEXP_SUBSTR(RAW_STRING, '"MessageId".*:.*"(.*)"', 1, 1, NULL, 1) AS MESSAGEID, 
     REGEXP_SUBSTR(RAW_STRING, '"TopicArn".*:.*"(.*)"', 1, 1, NULL, 1) AS TOPICARN, 
     REGEXP_SUBSTR(RAW_STRING, '"Message".*:.*"(.*)"', 1, 1, NULL, 1) AS MESSAGE, 
     REGEXP_SUBSTR(RAW_STRING, '"Timestamp".*:.*"(.*)"', 1, 1, NULL, 1) AS TIMESTAMP, 
     REGEXP_SUBSTR(RAW_STRING, '"SignatureVersion".*:.*"(.*)"', 1, 1, NULL, 1) AS SIGNATUREVERSION, 
     REGEXP_SUBSTR(RAW_STRING, '"Signature".*:.*"(.*)"', 1, 1, NULL, 1) AS SIGNATURE, 
     REGEXP_SUBSTR(RAW_STRING, '"SigningCertURL".*:.*"(.*)"', 1, 1, NULL, 1) AS SIGNINGCERTURL, 
     REGEXP_SUBSTR(RAW_STRING, '"UnsubscribeURL".*:.*"(.*)"', 1, 1, NULL, 1) AS UNSUBSCRIBEURL 
    FROM RAW_STRING_TABLE; 

SQLFiddle here

Best of luck.

+0

Das war genau das, wonach ich suchte. Ich danke dir sehr! – JHWin21