2014-01-16 66 views
1

我想從以下字符串中提取子代替md5_object_idPOSIX正則表達式來抽取子

{ 
     "associatedEntity": "60056", 
     "associatedObject": "md5_object_id", 
     "associatedAttr": "END22206", 
     "associatedAttr": "" 
} 

的md5_object_id是動態的,它可以採取任何有效的MD5字符串。 我嘗試了一些正則表達式,但我需要最有效的一個,因爲我在SQL Join查詢中使用提取的子字符串。我使用的是PostgreSQL 9.2,所以json函數不可用。

+0

那是一個* JSON *對象或東西(請提供適當的標記)?你究竟是什麼意思*「提取子字符串代替'md5_object_id'」*?提供一些示例輸入數據和預期輸出。另外重要的是你張貼你試過的東西(*「我試過一些正則表達式」*是不夠的)。 – ADTC

回答

0

這裏是你將如何使用正則表達式來提取它的一個例子:

(?<=associatedObject":)"([^"]*)"

Regex101 Example

+0

謝謝,但它不適用於postgresql。得到異常: 錯誤:無效的正則表達式:量詞操作數無效 SQL狀態:2201B –

+0

做了一個小小的修改::「([^」] *)「 –

+0

不錯。這種方式實際上更好,因爲您可以在非捕獲組內使用重複量詞。 –

1

在PostgreSQL 9.3及以上,使用json類型和->>操作:

regress=> SELECT json('{ 
     "associatedEntity": "60056", 
     "associatedObject": "md5_object_id", 
     "associatedAttr": "END22206", 
     "associatedAttr": "" 
}')->> 'associatedObject'; 
    ?column?  
--------------- 
md5_object_id 
(1 row) 

既然你沒有指定你的版本,我將愉快地假設你在當前版本中,所以你可以使用這個。


使用正則表達式這個工作是一個可怕的想法;就像使用正則表達式解析HTML一樣,它使用的是錯誤的工具。因此,相反,使用了JSON庫程序語言:

CREATE LANGUAGE plperlu; 

CREATE OR REPLACE FUNCTION json_get_key(object json, keyname text) returns text as $$ 
use strict; 
use warnings; 
use JSON; 
return decode_json($_[0])->{$_[1]}; 
$$ LANGUAGE plperlu; 

postgres=# SELECT json_get_key(json('{"a":1, "b":"c"}') , 'b'); 
json_get_key 
-------------- 
c 
(1 row) 

或:

CREATE LANGUAGE plpythonu; 

CREATE OR REPLACE FUNCTION json_get_key_py(object json, keyname text) returns text AS $$ 
import json 
return json.loads(object)[keyname] 
$$ LANGUAGE plpythonu; 

postgres=# SELECT json_get_key_py(json('{"a":1, "b":"c"}') , 'b'); 
json_get_key_py 
----------------- 
c 
(1 row) 

無法使用的程序語言要麼?你最好的選擇可能是把它拿到客戶端並在那裏解碼。

如果你可以限制你的json爲一個不使用unicode轉義的簡化形式,不允許轉義引號,不允許嵌套對象作爲值等,可以在Pg中使用正則表達式,但它仍然是一個壞主意。

+0

對不起,這是PostgreSQL 9.2,所以json運營商不可用 –

+1

@ user1982817 ....因此,您在問題中包含您使用的軟件版本。 –

+0

...雅,我明白了。問題編輯。 –