2015-08-12 16 views
1

Есть ли регулярное выражение, которое можно было бы использовать в инструкции обновления, которая заменила бы часть строки?Postggres Regex заменить часть строки

У меня есть строка, которая имеет согласованную строку по всем строкам, поэтому я ищу шаблон регулярного выражения, который будет искать определенный шаблон и заменить его? Например, скажем, у меня есть строка столбец, который имеет следующее значение:

{ 
    "test": "Some Value" 
    .... 
} 

Что я, по существу, глядя на это, чтобы соответствовать что-нибудь с «тест»:. И заменить это с тем, что я даю (например, "тест": "Some Other Value")

+0

вы используете :: JSon поданном? –

+0

Пожалуйста, не используйте регулярное выражение для замены парсера json. –

+0

@ craig-ringer Знаете ли вы, что лучше? Пожалуйста, поделитесь с нами. Мы много программистов, которые его ищут. http://dba.stackexchange.com/questions/54663/how-can-i-update-a-json-element-in-postgresql-json-datatype http://stackoverflow.com/questions/18209625/how-do -i-modify-fields-inside-the-new-postgresql-json-datatype –

ответ

0

Вы можете использовать:

regexp_replace(text1, '("test":\s*")(([^"]|\\")*)(")', '\1' || 'other value' || '\4' , 'g') 

Но, предупреждаю! Регулярное выражение заменяет внутренние значения «test»: value.

Примечания:

  1. \»внутри строки Ok
  2. нет никакого способа обнаружения внутренних устройств ocurences
  3. \ 1 & \ 4 являются захваты регулярного выражения, в этом случае вы могли бы поставить! прямо '' test ':' вместо '\ 1' и '' 'вместо' \ 4 '. Но \ п является более общим

Полный пример:

drop table if exists example; 

create table example(json1 json, text1 text); 

insert into example (json1, text1) values (
    '{"in":{"test": "inner"}, "test": "outer", "other": "some"}', 
    '{"in":{"test": "inner"}, "test": "outer", "other": "some"}' 
); 

insert into example (json1, text1) values (
    '{"in":{"test": "inner \"no\""}, "test": "outer \"yes\"", "other": "some"}', 
    '{"in":{"test": "inner \"no\""}, "test": "outer \"yes\"", "other": "some"}' 
); 

select * from example; 

select regexp_replace(text1, '("test":\s*")(([^"]|\\")*)(")', '\1' || 'other value' || '\4' , 'g') 
    from example; 

Если вы используете Postgres 9.4 вы можете использовать JSON или jsonb типа для столбца

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