Snowflake正则表达式需求:提取'-'后到';'前的目标文本
在Snowflake中提取'-'后至对应';'前文本的解决方案
方法一:REGEXP_EXTRACT_ALL + LISTAGG(推荐)
这种方法先批量提取所有符合要求的片段,再按格式拼接,逻辑直观,适配各种空格场景。
核心逻辑:
REGEXP_EXTRACT_ALL:用正则-([^;]+)匹配每个-到对应;之间的内容,把这些内容提取成一个结果集。TRIM():清理提取内容前后的空白(比如示例2里ZZZ ;中的尾随空格)。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
相关产品推荐
相关产品推荐

