【问题标题】:Postgres: remove second occurrence of a stringPostgres:删除第二次出现的字符串
【发布时间】:2017-07-07 07:01:51
【问题描述】:

我试图修复 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 替换第二次出现: update t_ddtrip_content set content = regexp_replace(content,dd_trip_photo_tags(332761),'') from t_ddtrip_content where tag_id=332761;

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

【问题讨论】:

    标签: regex postgresql replace


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 1970-01-01
      • 2018-02-05
      • 1970-01-01
      相关资源
      最近更新 更多