2017-10-18 4 views
0

J'essaye d'analyser une chaîne spécifique dans des colonnes dans ma table d'oracle par des expressions régulières et je deviens très confus par les différents exemples en ligne.Expression régulière

C'est la chaîne d'exemple que je veux analyser (cette chaîne est une valeur unique dans la colonne appelée raw string de la table raw_string_table):

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

(Indentation ajouté pour une meilleure lisibilité)

C'est ce que je veux que mon jeu de résultats être:

example result set

+0

Cela ressemble à un mauvais cas pour regex. Pourquoi ne pas sélectionner 2 listes d'objets impairs et pairs? – CAustin

+0

Ressemble à un ensemble de paires clé-valeur. Doit être apparié et capturé avec des regexes comme '" key1 ":" ([^ "] *)", "key2": "([^"] *) "...'. En fait 'Body' ressemble à un objet JSON. Avez-vous un analyseur disponible? – PJProudhon

+0

Pourriez-vous changer le code qui crée la chaîne de sorte qu'il utilise un format plus standard comme JSON? Vous pouvez ensuite utiliser une bibliothèque JSON pour l'analyser. – Barmar

Répondre

0

La chose la plus facile est de faire une expression régulière pour chaque valeur que vous essayez d'extraire - cette façon, vous n'êtes pas dépendant de la commande:

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

Bonne chance.

+0

C'était exactement ce que je cherchais. Merci beaucoup! – JHWin21