如何使用' regexp_replace()'在PostgreSQL中从开始位置替换到结束位置

时间:2017-04-25 06:27:03

标签: postgresql

我已经'THOMAS,RANJAN,JDJDJDJ,OOOO'

我想用Postgres中的x掩饰第1个第3个第4个字符

2 个答案:

答案 0 :(得分:1)

如果要对所有四个逗号分隔部分进行替换,可以使用以下内容:

WITH mytable(mystring) AS (SELECT 'THOMAS,RANJAN,JDJDJDJ,OOOO'::text)
SELECT string_agg(
          overlay(
             overlay(
                a.p
                placing 'x' from 1 for 1
             )
             placing 'xx' from 3 for 2
          ),
          ','
       )
FROM mytable
   CROSS JOIN LATERAL
      unnest(string_to_array(mystring, ',')) a(p);

导致

┌────────────────────────────┐
│         string_agg         │
├────────────────────────────┤
│ xHxxAS,xAxxAN,xDxxJDJ,xOxx │
└────────────────────────────┘
(1 row)

如果您不需要为所有部分进行替换,但对于整个字符串,只需使用两个overlay并忘记其余部分。

答案 1 :(得分:0)

您也可以使用正则表达式。一个正则表达式用于获取插入位置(其中x应该是),另一个用于获取其余的子串(文本应保持原样)。

以下内容也适用于较短的字符串。

SELECT test.replace_string_134('THOMAS,RANJAN,JDJDJDJ,OOOO,b,bl,bla');

产量:xHxxAS,xAxxAN,xDxxJDJ,xOxx,x,xl,xlx

我将此作为替代样本发布,但为了表现明智,您可以关注@LaurenzAlbe回答。

CREATE SCHEMA test;

CREATE OR REPLACE FUNCTION test.replace_string_134 (TEXT)
 RETURNS TEXT
AS
$$
DECLARE
  input_text ALIAS FOR $1;
BEGIN
  RETURN (
    SELECT STRING_AGG(
      CASE WHEN tgroup.txt_group[1] <> '' THEN 'x' ELSE '' END
       || trest.txt_rest[1]
       || CASE WHEN tgroup.txt_group[2] <> '' THEN 'x' ELSE '' END
       || CASE WHEN tgroup.txt_group[3] <> '' THEN 'x' ELSE '' END
       || trest.txt_rest[2],
       ',')
      FROM
      (
        SELECT txt_group, ROW_NUMBER() OVER () AS txt_index
        FROM regexp_matches(input_text, '[,]?([^,])[^,]?([^,]?)([^,]?)[^,]*[,]?', 'g') AS txt_group
      ) AS tgroup
      INNER JOIN
      (
        SELECT txt_rest, ROW_NUMBER() OVER () AS txt_index
          FROM regexp_matches(input_text, '[,]?[^,]([^,]?)[^,]?[^,]?([^,]*)[,]?', 'g') AS txt_rest
      ) AS trest
        ON trest.txt_index = tgroup.txt_index
  );
END
$$
LANGUAGE plpgsql;

SELECT test.replace_string_134('THOMAS,RANJAN,JDJDJDJ,OOOO,b,bl,bla');

DROP SCHEMA test CASCADE;