Redshift:如何从字符串列表中匹配最长的正则表达式字符串

Posted

技术标签:

【中文标题】Redshift:如何从字符串列表中匹配最长的正则表达式字符串【英文标题】:Redshift: how to match longest regex string from a list of strings 【发布时间】:2021-09-10 15:14:06 【问题描述】:

上下文:

我目前正在解析错误消息,我的方法是用自定义错误类型标记最长的字符串,虽然有点笨拙。 所以我有一个这样的子字符串字典:

'abcdefg' : 'Error A', '1234' : 'Error B', 'aaa' : 'Error C'

例如: 如果我有一个错误字符串: 'abcdefg1234',我想将它与错误 A 匹配,因为 abcdefg 是消息中最长的标记子字符串。

'abc1234aaa' 将返回 'Error B'

我相信这个想法是先追加最长的子字符串,然后加入标签字典表。

我知道如何进行 1 次正则表达式匹配,但我不知道如何遍历列表以找到最长的匹配项。

【问题讨论】:

【参考方案1】:

SQL 不是过程语言,也没有循环的概念(通常)。我喜欢将其视为一种并行合并和过滤语言。因此,要执行您想要的操作,您需要执行几个步骤

    将您的 json 字典转换为表格 将此表加入到正在评估错误字符串的表中的 LIKE 条件下,该条件测试错误测试值是否在错误字符串中 评估每个匹配的长度并排序这些长度以找到最长的(窗口函数 row_number() 将是我的选择)

生成的 SQL 将类似于:

SELECT error_message,
    TYPE
FROM   (   
           SELECT    error_message,
                  TYPE,
                  Row_number () over (PARTITION BY error_message ORDER BY length DESC) AS rn
           FROM      message_table
           left join       
                  (   
                      SELECT 'Error A'                          AS TYPE,
                          Json_extract_path_text(pattern_json, 'Error A')      AS pattern,
                          Len(Json_extract_path_text(pattern_json, 'Error A')) AS length
                      union ALL
                      SELECT 'Error B'                          AS TYPE,
                          json_extract_path_text(pattern_json, 'Error B')      AS pattern,
                          len(json_extract_path_text(pattern_json, 'Error B')) AS length
                      UNION ALL
                      SELECT 'Error C'                          AS TYPE,
                          json_extract_path_text(pattern_json, 'Error C')      AS pattern,
                          len(json_extract_path_text(pattern_json, 'Error C')) AS length )
           ON     pattern LIKE '%'+pattern+'%'
) 
WHERE rn = 1;

此代码未经测试,我对您正在做的事情做了一些假设,但希望这将为您提供一条起点。

【讨论】:

以上是关于Redshift:如何从字符串列表中匹配最长的正则表达式字符串的主要内容,如果未能解决你的问题,请参考以下文章

Amazon Redshift 中匹配序列数字的正则表达式

Redshift 正则表达式匹配直到模式匹配但不包含模式

说说在 Python 中,如何找出所有字符串匹配

如何从 Redshift 的正则表达式组中选择第一个结果?

如何在红移中进行动态正则表达式匹配?

正则表达式将字符串限制为最短匹配与最长匹配(非贪婪组)?