我正在尝试使用 Snowflake 的 match_recognize 工具跨行匹配特定模式。该模式由 a 和 b 的任意序列组成,前提是排除了 b 的长串。在我的测试用例中,我希望允许最多 4 个 b 的运行包含在匹配中。
使用得心应手的 https://regexr.com/?2tp0k网站,我能够构建所需的正则表达式:
((ab{0,4})+a)|a+
将它应用到这个字符串:
baabbbaaaaaaaababbabbabbbabbbabbbab
我得到了这个匹配项(粗体),我很满意:
baabbbaaaaaaaababbabbabbabbbabbbab
根据需要,这会将 4 或更短的 b 的任何游程吸收到匹配中。 (它不会在字符串的开头选择 b 或在结尾的 b ,但这是预期的。)还要注意,虽然它不包含任何长时间的 b,整场比赛都会有一堆 b。
出于某种原因,当我将此正则表达式与 Snowflake 的 match_recognize 模式一起使用时,它不会占用 b 的所有短运行。
因此,它不匹配上面匹配的整个序列,而是匹配这些:
baabbbaaaaaaaababbabbabbabbbabbbab
有什么建议吗?
这是说明结果的查询:
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;
导致了这个结果。第 25-27 行不包含在匹配中,从第 28 行开始新的匹配。
最佳答案
有趣的是,将模式从 ((ab{0,4})+a)|a+
更改为 ( ((a | ab | abb | abbb | abbbb)+ a) | 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 | ab | abb | abbb | abbbb)+ a) | a+ )
DEFINE
a as column2 = 'a',
b as column2 = 'b'
)
ORDER BY 1;
输出:
关于regex - 雪花 match_recognize 不包括使用量词的给定模式的所有实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73788973/