regex - 雪花 match_recognize 不包括使用量词的给定模式的所有实例

标签 regex snowflake-cloud-data-platform match-recognize

我正在尝试使用 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 行开始新的匹配。

Image of results

最佳答案

有趣的是,将模式从 ((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;

输出:

enter image description here

关于regex - 雪花 match_recognize 不包括使用量词的给定模式的所有实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73788973/

相关文章:

snowflake-cloud-data-platform - MATCH_RECOGNIZE 查找不以特定模式结束的事件

php - 将链接转换为超链接,但第一个链接转换所有其他链接

java - Java的正则表达式引擎是否在内部优化了字符类表达式?

regex - 我如何在 vim 中翻译正则表达式以与 sed 一起工作?

java - 解析文本正文以匹配两个正则表达式的最有效方法?

snowflake-cloud-data-platform - 断言一组列可以形成 Snowflake 中的主键的最佳方法是什么?

sql - 根据 SQL 条件分配季度数和年份数

snowflake-cloud-data-platform - 雪花: what is the APPADMIN role?