如何删除遵循模式的子字符串
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【讨论】:
以上是关于如何删除遵循模式的子字符串的主要内容,如果未能解决你的问题,请参考以下文章