2014-01-16 68 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

...雅,我明白了。问题编辑。 –