Postrgres Regex替换String的一部分

时间:2015-08-12 10:27:50

标签: postgresql

是否有可以在update语句中使用的正则表达式替换字符串的一部分?

我有一行在所有行中都有一致的字符串,所以我正在寻找一个寻找特定模式并替换它的正则表达式模式?例如,假设我有一个具有以下值的列行:

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

我真正想要的是用“测试”来匹配任何东西:并用我给的任何东西替换它(例如,“测试”:“其他一些价值”)

1 个答案:

答案 0 :(得分:0)

您可以使用:

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

但是,警告!正则表达式取代了“test”的内在性:值。

注意:

  1. \“里面的字符串都好!
  2. 无法检测内部发生
  3. \ 1& \ 4是正则表达式的捕获,在这种情况下你可以直接''test':'而不是'\ 1'和'“'而不是'\ 4'。但是\ n更通用
  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类型作为列