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

Snowflake正则表达式需求:提取'-'后到';'前的目标文本

在Snowflake中提取'-'后至对应';'前文本的解决方案

方法一:REGEXP_EXTRACT_ALL + LISTAGG(推荐)

这种方法先批量提取所有符合要求的片段,再按格式拼接,逻辑直观,适配各种空格场景。

核心逻辑:

  1. REGEXP_EXTRACT_ALL:用正则-([^;]+)匹配每个-到对应;之间的内容,把这些内容提取成一个结果集。
  2. TRIM():清理提取内容前后的空白(比如示例2里ZZZ ;中的尾随空格)。
  3. LISTAGG():把提取到的片段用指定分隔符连起来。

示例1代码:

SELECT LISTAGG(TRIM(match), ';') AS extracted_result
FROM TABLE(REGEXP_EXTRACT_ALL('008-1994; 023-1905; 030-2330', '-([^;]+)', 1)) AS matches;

输出:1994;1905;2330

示例2代码:

SELECT LISTAGG(TRIM(match), '; ') AS extracted_result
FROM TABLE(REGEXP_EXTRACT_ALL('008-XXX; 023-YYY; 030-ZZZ ; 042-AAA', '-([^;]+)', 1)) AS matches;

输出:XXX; YYY; ZZZ; AAA


方法二:REGEXP_REPLACE直接替换

如果不想用表值函数,也可以直接通过正则替换一步到位,需要注意正则细节适配空格。

示例1代码:

SELECT RTRIM(
    REGEXP_REPLACE(
        '008-1994; 023-1905; 030-2330',
        '[^-]+-([^;]+);\\s*',
        '\\1;'
    ),
    ';'
) AS extracted_result;
  • 正则[^-]+-([^;]+);\\s*:匹配-前的所有字符,捕获目标文本,同时吃掉;后的空白。
  • 最后用RTRIM去掉末尾多余的;。

示例2代码:

SELECT RTRIM(
    REGEXP_REPLACE(
        '008-XXX; 023-YYY; 030-ZZZ ; 042-AAA',
        '[^-]+-\\s*([^;]+?)\\s*;\\s*',
        '\\1; '
    ),
    '; '
) AS extracted_result;
  • 正则里的\\s*和非贪婪匹配[^;]+?用来适配-和;前后的任意空白,确保只捕获核心文本。
  • 最后用RTRIM去掉末尾多余的; 。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:35:13