Postgres:删除第二次出现的字符串

时间:2017-02-17 16:47:14

标签: regex postgresql replace

我试图修复postgres数据库中的错误数据,其中照片标记被追加两次。

The trip is wonderful.<photo=2-1-1601981-7-1.jpg><photo=2-1-1601981-5-2.jpg>We enjoyed it very much.<photo=2-1-1601981-5-2.jpg><photo=2-1-1601981-7-1.jpg>

正如您在字符串中看到的那样,已添加了照片标记,但它们又被添加到文本中。我想删除第二次出现:。第一次出现有一定的顺序,我想保留它们。

我编写了一个可以构造正则表达式模式的函数:

CREATE OR REPLACE FUNCTION dd_trip_photo_tags(tagId int) RETURNS text 
LANGUAGE sql IMMUTABLE  
AS $$
SELECT string_agg(concat('<photo=',media_name,'>.*?(<photo=',media_name,'>)'),'|')  FROM   t_ddtrip_media WHERE tag_id=tagId $$;

这会捕获某个照片标记的第二次出现。 然后,我使用regex_replace替换第二次出现: 更新t_ddtrip_content set content = regexp_replace(content,dd_trip_photo_tags(332761),'')来自t_ddtrip_content,其中tag_id = 332761;

然而,它会删除所有匹配的标签。我在网上查了好几天但仍无法找到解决这个问题的方法。感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

这应该有效。

正则表达式1:

<photo=.+?>

请参阅:https://regex101.com/r/thHmlq/1

正则表达式2:

<.+?>

请参阅:https://regex101.com/r/thHmlq/2

输入:

The trip is wonderful.<photo=2-1-1601981-7-1.jpg><photo=2-1-1601981-5-2.jpg>We enjoyed it very much.<photo=2-1-1601981-5-2.jpg><photo=2-1-1601981-7-1.jpg>

输出:

<photo=2-1-1601981-7-1.jpg>
<photo=2-1-1601981-5-2.jpg>
<photo=2-1-1601981-5-2.jpg>
<photo=2-1-1601981-7-1.jpg>