Snowflake正则:匹配最后斜杠与.parquet间下划线分隔文本
提取Parquet文件名指定分段的正则方案(Snowflake)
问题场景
给定文件路径:
test_stage/parquet_location/9f7d37fd-7039-4454-94ef-2b0cd6c3206a_b1df97ad-54dc-4fc9-a099-1fb9cd6530be_custom_1696963985.parquet
需要提取最后一个/与.parquet之间由_分隔的所有分段,预期结果:
9f7d37fd-7039-4454-94ef-2b0cd6c3206ab1df97ad-54dc-4fc9-a099-1fb9cd6530becustom1696963985
原表达式问题
你尝试的(?<=/)[^/_]+(_[^/_]+)*.parquet无法满足需求,原因是该表达式会匹配从最后一个/到.parquet的整个字符串,而非拆分_分隔的独立分段。
解决方案
方案1:先提取目标子串再拆分
先通过正则提取最后一个/到.parquet之间的完整子串,再用SPLIT函数按_拆分:
SELECT SPLIT( REGEXP_SUBSTR( 'test_stage/parquet_location/9f7d37fd-7039-4454-94ef-2b0cd6c3206a_b1df97ad-54dc-4fc9-a099-1fb9cd6530be_custom_1696963985.parquet', '[^/]+(?=\.parquet$)' ), '_' ) AS split_segments;
方案2:直接用regexp_substr_all匹配所有分段
使用精准正则直接匹配每个符合要求的分段,无需额外拆分:
SELECT REGEXP_SUBSTR_ALL( 'test_stage/parquet_location/9f7d37fd-7039-4454-94ef-2b0cd6c3206a_b1df97ad-54dc-4fc9-a099-1fb9cd6530be_custom_1696963985.parquet', '(?<=/|_)([^_.]+)(?=_|\.parquet)' ) AS matched_segments;
正则解释:
(?<=/|_):正向预查,确保当前匹配段的前导是/或_([^_.]+):匹配不含_和.的字符,即单个分段内容(?=_|\.parquet):正向预查,确保当前匹配段的后续是_或.parquet
内容的提问来源于stack exchange,提问作者HelloWorld
相关产品推荐
相关产品推荐

