2017-10-18 185 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