正则实现:括号内无指定子串取括号内容否则取括号外内容(适配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
相关产品推荐
相关产品推荐

