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

正则实现:括号内无指定子串取括号内容否则取括号外内容(适配SQL)

SQL正则实现括号内容过滤方案

规则说明

待处理字符串统一为片段A (片段B)的单括号结构,需要过滤掉包含指定关键词coder(不区分大小写)的片段,返回剩余的有效内容,示例输入输出如下:

  • 输入1:Coder X.Y. (Something Dogs Do X.Y.) → 输出:Something Dogs Do X.Y.
  • 输入2:Something Cats Ignore X.Y. (Coder X.Y.) → 输出:Something Cats Ignore X.Y.

核心正则(单括号场景,推荐)

针对单组括号的业务场景,直接用捕获组匹配目标内容即可,正则模式(开启不区分大小写标志):

(?i)^(?:.*coder.*\(\s*([^()]+?)\s*\)|\s*([^()]+?)\s*\(.*coder.*\))$

逻辑说明:

  • 分支1:如果括号外内容包含coder,捕获括号内的内容
  • 分支2:如果括号内内容包含coder,捕获括号外的内容
  • 最终取两个捕获组中第一个非空的值就是结果

不同SQL方言适配示例

  • MySQL 8.0.22+

    SELECT 
      REGEXP_SUBSTR(
        your_column,
        '(?i)^(?:.*coder.*\\(\\s*([^()]+?)\\s*\\)|\\s*([^()]+?)\\s*\\(.*coder.*\\))$',
        1, 1, 'c', 1
      ) AS target_content
    FROM your_table;
    

    注:最后一个参数1表示返回第一个非空捕获组的内容。

  • PostgreSQL

    SELECT 
      COALESCE(
        (REGEXP_MATCHES(your_column, '(?i)^(?:.*coder.*\(\s*([^()]+?)\s*\)|\s*([^()]+?)\s*\(.*coder.*\))$'))[1],
        (REGEXP_MATCHES(your_column, '(?i)^(?:.*coder.*\(\s*([^()]+?)\s*\)|\s*([^()]+?)\s*\(.*coder.*\))$'))[2]
      ) AS target_content
    FROM your_table;
    
  • ClickHouse

    SELECT 
      arrayFirst(x -> x != '', extractGroups(your_column, '(?i)^(?:.*coder.*\\(\\s*([^()]+?)\\s*\\)|\\s*([^()]+?)\\s*\\(.*coder.*\\))$')) AS target_content
    FROM your_table;
    

多括号复杂场景方案

如果字符串存在多组括号,不需要写复杂正则,直接沿用分割过滤逻辑即可,可读性更高,以Spark SQL为例:

WITH split_tmp AS (
  SELECT
    row_id,
    trim(part) AS content_part
  FROM your_table
  LATERAL VIEW explode(split(your_column, '[()]')) t AS part
  WHERE trim(part) != ''
)
SELECT row_id, content_part AS target_content
FROM split_tmp
WHERE lower(content_part) NOT LIKE '%coder%'

内容的提问来源于stack exchange,提问作者at8865

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:27:29