PostgreSQL 11 提取特殊字符'('前所有字符串的实现方法
PostgreSQL 11 多括号字段截取方案
问题说明
表字段col1存储的是用|分隔的指标值,部分指标后面带括号包裹的注释内容,需要删除所有(开头、)结尾的注释片段,保留括号前的指标名称,原有正则^(.*) \(.*因贪婪匹配仅能处理最后一个括号,无法全局生效。
样例原始数据:
col1 BCR-ABL (translocation) | MLL-AF4 (translocation) | E2A-PBX1 (translocation) | TEL-AML1 (translocation) | c-MYC (rearrangement) | CRLF2 (rearrangement) | PAX5 (rearrangement) EVC1 | EVC2 EBF3 TMCO1
期望输出:
col1 BCR-ABL | MLL-AF4 | E2A-PBX1 | TEL-AML1 | c-MYC | CRLF2 | PAX5 EVC1 | EVC2 EBF3 TMCO1
正确实现方式
直接使用PostgreSQL内置的regexp_replace函数,开启全局替换标志,匹配所有括号注释片段并删除即可,无需额外分支判断:
SELECT regexp_replace(col1, '\s*\([^)]*\)', '', 'g') AS col1 FROM 你的表名;
规则说明
- 匹配规则
\s*\([^)]*\)的含义:\s*:匹配括号前0到多个空白字符,避免删除括号后|分隔符前后残留多余空格\(:转义匹配左括号((括号是正则特殊字符,必须转义)[^)]*:匹配任意个非右括号的字符,也就是两个括号中间的注释内容\):转义匹配右括号)
- 替换值为空字符串,即把所有匹配到的注释片段直接删掉
- 替换标志
g代表全局匹配,会处理字段内所有符合规则的片段,而非仅处理第一个/最后一个匹配项
效果说明
- 存在多个括号注释的行,会一次性删除所有
(注释内容)片段,得到干净的指标名称拼接结果 - 不存在括号的行(比如纯
EVC1 | EVC2、EBF3这类值)匹配不到规则,会原样返回,完全符合预期 - 原写法失效的核心原因是整行贪婪匹配逻辑,仅能捕获到最后一个
(的位置做截断,无法处理多括号场景。
内容的提问来源于stack exchange,提问作者rshar
相关产品推荐
相关产品推荐

