2014-01-16 3 views
1

Я хочу, чтобы извлечь подстроку вместо md5_object_id из следующей строки:POSIX регулярное выражение для извлечения подстроки

{ 
     "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

Небольшая модификация выполняла работу :(?: associatedObjectID ":)" ([^ "] *)" –

+0

Nice. Этот способ на самом деле лучше, потому что вы можете использовать кванторы повторения внутри группы без захвата. –

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 упрощенной формой, которая не использует escape-символы unicode, не позволяет экранировать экранированные кавычки, не позволяет вложенным объектам как значениям и т. Д., Может быть возможно использовать регулярное выражение в Pg , но это все еще плохая идея.

+0

Извините, это PostgreSQL 9.2, поэтому json-операторы недоступны –

+1

@ user1982817 .... и именно поэтому вы включаете версии программного обеспечения, которое вы используете в вопросах. –

+0

... Я, я понял. вопрос отредактирован. –

Смежные вопросы