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

如何在SQL查询中标记返回行匹配的正则表达式

在BigQuery单查询中标记匹配的正则规则

针对你的需求,有两种实用的实现方式,都能在单次查询里完成过滤和标记:

方式一:返回所有匹配的规则(支持一行匹配多个正则)

把所有正则规则整理成带标识的数组,通过关联匹配后聚合结果,能得到每行所有匹配的规则ID:

WITH regex_rules AS (
  SELECT * FROM UNNEST([
    STRUCT('expression_1' AS rule_id, r"[a-z0-9A-Z]{40}" AS pattern),
    STRUCT('expression_2' AS rule_id, r"[0-9a-z]{32}" AS pattern),
    -- 继续添加你的其他规则,比如
    STRUCT('expression_n-1' AS rule_id, r"[a-z0-9]{80}" AS pattern),
    STRUCT('expression_n' AS rule_id, r"[a-z0-9A-Z\%]{35}" AS pattern)
  ])
)
SELECT 
  t.*,
  STRING_AGG(r.rule_id, ', ') AS matched_rules
FROM Sample_Table t
JOIN regex_rules r ON REGEXP_CONTAINS(t.content, r.pattern)
GROUP BY t.* -- BigQuery支持按所有字段直接分组
ORDER BY t.some_column; -- 替换成你需要排序的字段

这个方法会把每行匹配的所有规则用逗号拼接起来,比如某行同时匹配expression_1和expression_2,matched_rules就会显示expression_1, expression_2。

方式二:返回第一个匹配的规则(按优先级标记)

如果只需要知道每行匹配的第一个规则(按你定义的顺序),可以用CASE WHEN链式判断,效率更高:

SELECT
  *,
  CASE
    WHEN REGEXP_CONTAINS(content, r"[a-z0-9A-Z]{40}") THEN 'expression_1'
    WHEN REGEXP_CONTAINS(content, r"[0-9a-z]{32}") THEN 'expression_2'
    -- 依次添加后续规则
    WHEN REGEXP_CONTAINS(content, r"[a-z0-9]{80}") THEN 'expression_n-1'
    WHEN REGEXP_CONTAINS(content, r"[a-z0-9A-Z\%]{35}") THEN 'expression_n'
  END AS matched_rule
FROM Sample_Table
WHERE
  REGEXP_CONTAINS(content, r"[a-z0-9A-Z]{40}") OR
  REGEXP_CONTAINS(content, r"[0-9a-z]{32}") OR
  REGEXP_CONTAINS(content, r"[a-z0-9]{80}") OR
  REGEXP_CONTAINS(content, r"[a-z0-9A-Z\%]{35}")

注意:CASE WHEN是按顺序判断的,只要第一个匹配的条件满足,就会返回对应的规则ID,后面的条件不会再执行。如果想简化WHERE条件,可以把所有正则用|拼接成一个大的正则表达式,避免重复写判断条件。

内容的提问来源于stack exchange,提问作者Setu Kumar Basak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:39:15