POSIX正则表达式提取子字符串

时间:2014-01-16 05:37:43

标签: regex postgresql

我想从以下字符串中提取子字符串来代替md5_object_id

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

md5_object_id是动态的,可以使用任何有效的md5字符串。 我尝试了一些正则表达式,但我需要最有效的一个,因为我在SQL Join查询中使用了提取的子字符串。我正在使用PostgreSQL 9.2,所以json函数不可用。

2 个答案:

答案 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中使用正则表达式,但这仍然是一个坏主意。

答案 1 :(得分:0)

以下是如何使用正则表达式提取它的示例:

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

Regex101 Example