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

上下文:

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

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

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

'abc1234aaa' 将返回 'Error B'

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

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

【问题讨论】:

    标签: regex amazon-redshift


    【解决方案1】:

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

    1. 将您的 json 字典转换为表格
    2. 将此表加入到正在评估错误字符串的表中的 LIKE 条件下,该条件测试错误测试值是否在错误字符串中
    3. 评估每个匹配的长度并排序这些长度以找到最长的(窗口函数 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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-08
      • 2012-03-02
      • 1970-01-01
      • 2012-06-05
      • 2013-12-25
      • 1970-01-01
      相关资源
      最近更新 更多