如何删除遵循某种模式的子字符串

How to remove substrings that follow a pattern

我有一个查询 returns 一个包含我需要清理的字符串的列。我想删除此字符串中以“,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)
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个任意字符

试试这个对你有帮助......

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;

starts with ",id:" and ends right before ")"

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');

相关:

  • Avoid PG::InvalidTextRepresentation error when using Postgres UUID in Rails
  • Regex remove all occurrences of multiple characters in a string