Snowflake中如何提取Prod列中TAB/LAB/RAB前的内容?
解决Snowflake中提取TAB/LAB/RAB前内容的正则问题
问题分析
你当前的正则表达式^(.+)TAB|LAB|RAB存在两个核心问题:
- 优先级错误:
|的优先级极低,导致正则被拆分成三个独立模式:^(.+)TAB、LAB、RAB,而非将TAB|LAB|RAB作为一个整体匹配终止符。 - 贪婪匹配导致冗余:
(.+)是贪婪匹配,会尽可能捕获最多字符,最终把终止词(如TAB)也包含进结果里。
正确解决方案
使用非贪婪匹配结合非捕获组,精准定位终止词前的内容。推荐使用REGEXP_EXTRACT(单匹配场景更高效):
REGEXP_EXTRACT(PROD, '^(.+?)\\s*(?:TAB|LAB|RAB)\\b') as AB
如果坚持用REGEXP_EXTRACT_ALL,取数组第一个元素即可:
REGEXP_EXTRACT_ALL(PROD, '^(.+?)\\s*(?:TAB|LAB|RAB)\\b')[0] as AB
正则解释
^:匹配字符串开头,确保从最左侧开始提取(.+?):非贪婪匹配任意字符,捕获到分组1(核心提取内容),避免贪婪匹配过度捕获终止词\\s*:匹配终止词前可能存在的空格(兼容带空格或不带空格的场景)(?:TAB|LAB|RAB):非捕获组,匹配三个目标终止词中的任意一个,不占用捕获分组\\b:单词边界,确保匹配完整的终止词,避免误匹配包含这些字符串的其他单词
测试结果
对你的输入数据执行后,会得到预期输出:
"GLASS VERT" "GLASS ROUGE" "GLASS JAUNE VERT"
内容的提问来源于stack exchange,提问作者Rumi
相关产品推荐
相关产品推荐

