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

Posted

技术标签:

【中文标题】如何删除遵循模式的子字符串【英文标题】: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 是的。 【参考方案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');

相关:

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

【讨论】:

以上是关于如何删除遵循模式的子字符串的主要内容,如果未能解决你的问题,请参考以下文章

PB中取字符串子串的函数是啥

华为OD机试真题Java实现判断字符串子序列真题+解题思路+代码(2022&2023)

2022华为机试真题 C++ 实现 字符串子序列II

PB中取字符串子串的函数是啥

字符串子串去重之后的个数

使用 Python 的字符串子序列内核和 SVM