【问题标题】:How to remove substrings that follow a pattern如何删除遵循模式的子字符串
【发布时间】:2021-07-05 08:07:42
【问题描述】:

我有一个查询,它返回一个包含我需要清理的字符串的列。我想删除此字符串中以“,id:”开头并在“)”之前结束的部分。该字符串可能会多次出现要删除的子字符串。 “id:”后面的字母数字子串始终是相同的长度。

这是一个示例字符串:

(label:Boston,include:true,id:9fc53def-0b9d-45cb-8f12-d42c3ca70ab2),
(label:Cambridge,include:true,id:dda3d6d7-f9d1-45ac-ac6e-5866b356966e)

这是我想在最后看到的字符串:

(label:Boston,include:true),
(label:Cambridge,include:true)

【问题讨论】:

  • 要删除的字符串是否总是标准 Postgres 输出格式的 UUID?带有 4 个破折号的小写十六进制。
  • @ErwinBrandstetter 是的。

标签: postgresql replace regexp-replace


【解决方案1】:
SELECT regexp_replace(
          '(label:Cambridge,include:true,id:dda3d6d7-f9d1-45ac-ac6e-5866b356966e)',
          ',?\mid:.{36}',  -- pattern
          '',            -- replacement
          'g'            -- flag: replace multiple occurrences
       );
         regexp_replace         
════════════════════════════════
 (label:Cambridge,include:true)
(1 row)

解释模式:

  • ,? 匹配逗号,如果有的话

  • \m 匹配单词的开头

  • .{36} 匹配 36 个任意字符

【讨论】:

  • 感谢@laurenz,工作就像一个魅力。你能帮我理解“?”,“。”的用法吗?和模式中的“{}”?
  • 我已经添加了一些解释。
【解决方案2】:

试试这个,它会帮助你......

select SUBSTRING('label:Boston,include:true,id:9fc53def-0b9d-45cb-8f12-d42c3ca70ab2',1,LEN('label:Boston,include:true,id:9fc53def-0b9d-45cb-8f12-d42c3ca70ab2')-40) as stringaa;

【讨论】:

  • 示例字符串是一个值,而不是两个。该模式可以在一个值内重复多次。
【解决方案3】:

以“,id:”开头,在“)”之前结束

SELECT regexp_replace(string, ',id:[0-9a-f-]{36}\)', ')', 'g');

在您的描述中,逗号和右括号都不是可选的。

或者使用更严格的模式来匹配标准 Postgres UUID 格式为described in the manual

SELECT regexp_replace(string
                    , ',id:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\)'
                    , ')', 'g');

相关:

【讨论】:

    猜你喜欢
    • 2019-03-03
    • 2014-03-15
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    相关资源
    最近更新 更多