You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:57:23