Snowflake match_recognize未匹配所有符合量词规则的模式问题求助
Snowflake MATCH_RECOGNIZE 分段匹配问题解决
问题分析
你构建的正则((ab{0,4})+a)|a+在字符串匹配工具中能正常捕获包含最多4个连续b的a序列,但在Snowflake的MATCH_RECOGNIZE中出现分段:行25-27的3个连续b(符合≤4的限制)未被纳入前一个匹配,新匹配从行28的a开始。这是因为Snowflake的MATCH_RECOGNIZE模式匹配逻辑与标准正则存在差异——原模式((a b{0,4})+ a)要求每轮循环必须以a结尾,当行24的a后跟着3个b但无后续a时,匹配会提前终止于行24,无法将后续符合条件的b和下一个a纳入同一匹配。
解决方案
调整PATTERN结构,让模式能容纳a之间的短连续b序列,同时允许匹配以a开头、中间夹着合法b、最终以a结尾的完整序列。修改后的查询代码如下:
WITH data AS ( SELECT * FROM VALUES ( 0,'b'),( 1,'a'),( 2,'a'),( 3,'b'),( 4,'b'),( 5,'b'),( 6,'a'),( 7,'a'),( 8,'a'),( 9,'a'), (10,'a'),(11,'a'),(12,'a'),(13,'a'),(14,'b'),(15,'a'),(16,'b'),(17,'b'),(18,'a'),(19,'b'), (20,'b'),(21,'a'),(22,'b'),(23,'b'),(24,'a'),(25,'b'),(26,'b'),(27,'b'),(28,'a'),(29,'b'), (30,'b'),(31,'b'),(32,'a'),(33,'b') ) SELECT * FROM data match_recognize( order by column1 measures match_number() as "MATCH_NUMBER", match_sequence_number() as msq, classifier() as cl all rows per match with unmatched rows PATTERN ( a (b{0,4} a)* | a+ ) DEFINE a as column2 = 'a', b as column2 = 'b' ) ORDER BY 1;
模式说明
a (b{0,4} a)*:以a开头,后续可重复任意次数“最多4个连续b + 一个a”,这样能将所有a之间的合法短b序列纳入同一匹配,避免提前终止。a+:处理连续的a序列,保持原需求逻辑。
修改后,行1-32的所有符合条件的a和短b序列会被合并为同一个匹配,行0和行33的单独b会被标记为unmatched,符合你排除长连续b、保留合法序列的需求。
内容的提问来源于stack exchange,提问作者Eric Cler
相关产品推荐
相关产品推荐

