【问题标题】:Snowflake REGEXP_REPLACE guidence雪花 REGEXP_REPLACE 指导
【发布时间】:2021-01-06 23:07:03
【问题描述】:

我正在寻求一些帮助来调试 Snowflake 中的 REGEXP_REPLACE() 语句。

我想用#替换双引号字符串之间的|(pipe)。

例子:

"Foreign Corporate| Name| Registration"|"99999"|"Valuation Research"

要求的结果:

"Foreign Corporate# Name# Registration"|"99999"|"Valuation Research"

我已经尝试使用 (?!(([^"]"){2})[^"]*$)[|]substitution\1# 进行 regex101.com,工作正常,但在 Snowflake 中不起作用。

【问题讨论】:

    标签: snowflake-cloud-data-platform


    【解决方案1】:

    Snowflake 中的正则表达式函数不向前看也不向后看。如果您想使用带有前瞻和后瞻功能的正则表达式,您可以在 JavaScript UDF 中执行此操作。

    请注意,这里的正则表达式会查找所有管道,包括双引号内的管道。我能够找到一个正则表达式,它可以在双引号之外找到管道,这就是为什么这个 UDF 按这些发现拆分并重新加入字符串的原因。如果您可以找到一个正则表达式来查找在双引号内而不是在双引号外的管道,则可以简化 UDF。但是,拆分它允许其他可能性,例如如果您想这样做,可以删除包装引号。

    set my_string = '"Foreign Corporate| Name| Registration"|"99999"|"Valuation Research"';
    
    create or replace function REPLACE_QUOTED_PIPES(STR string)
    returns string
    language javascript
    as
    $$
        const search = `(?!\\B"[^"]*)\\|(?![^"]*"\\B)`;
        const searchRegExp = new RegExp(search, 'g');
        
        var splits = STR.split(searchRegExp);
        var out = "";
        var del = "|";
        
        for(var i = 0; i < splits.length; i++) {
            if (i == splits.length -1) del = "";
            out += splits[i].replace(/\|/g, '#') + del;
        }
        return out;
    $$;
    
    select REPLACE_QUOTED_PIPES($my_string);
    

    【讨论】:

    • 这很好用!谢谢你的帮助。感谢您的回复。
    【解决方案2】:

    不同的方法,只使用 REPLACE

    1. 替换“|”带有一个永远不会出现在您的数据中的字符串。我在我的例子中使用了@@@
    2. 用#替换剩余的管道
    3. 将虚拟字符串@@@ 替换回原始值“|”

    例如

    replace(replace(replace(sample_text,'"|"','@@@'),'|','#'),'@@@','"|"') 
    

    显示每个步骤的 SQL 语句:

    select
    sample_text
    ,replace(sample_text,'"|"','@@@') r1
    ,replace(replace(sample_text,'"|"','@@@'),'|','#') r2
    ,replace(replace(replace(sample_text,'"|"','@@@'),'|','#'),'@@@','"|"') r3
    from test_solution;
    

    【讨论】:

    • 这是实现主要目标的一种非常聪明的方法,而不是尝试复杂的正则表达式,加油!
    • 感谢您的回复。如果管道前后有“s”,则此方法有效。我也有管道前后没有“s”的情况。示例:“外国公司|名称|注册”|“99999”|Test|Test123。
    猜你喜欢
    • 2021-03-31
    • 1970-01-01
    • 2021-07-22
    • 2021-12-17
    • 2021-04-19
    • 2020-08-06
    • 2021-12-03
    • 2021-11-12
    • 2021-10-10
    相关资源
    最近更新 更多