2017-10-18 27 views
0

我想通過正則表達式解析一個特定的字符串到我的oracle表中的列中,並且我在網上的不同示例中感到非常困惑。正則表達式

這是樣品字符串我想解析(此字符串是一列有一個值從表raw_string_table稱爲raw string):

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

(縮進增加了可讀性)

這是我希望我的結果設置爲:

example result set

+0

看起來像正則表達式的壞例子。爲什麼不從奇數和偶數項目中選擇2個列表? – CAustin

+0

看起來像一組鍵值對。應該用''key1「:」([^「] *)」,「key2」:「([^」] *)「...'等正則表達式匹配和捕獲。實際上'Body'看起來像一個json對象。你有任何可用的解析器? – PJProudhon

+0

您可以更改創建字符串的代碼,以便使用更類似JSON的標準格式嗎?然後你可以使用JSON庫來解析它。 – Barmar

回答

0

最簡單的事情是做正則表達式爲你想提取每個價值 - 這樣你不依賴於排序:

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

好運。

+0

這是我正在尋找的確切的東西。非常感謝! – JHWin21