snowflake中惰性正则表达式的替代解决方案,因为snowflake中不提供此功能

qni6mghb  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(349)

我试图从字符串中解析“name”和“address”。我已经编写了regex模式,它使用regex的“ungreedy/lazy”特性运行得非常好(我在regex101.com中进行了验证),但是不使用greedy。以下是我的雪花查询:

select
TRIM(REGEXP_SUBSTR(column1,'(^\\D*)((\\bP[OST]*[ .]*O[FFICE]*[ .]*B[OX]*[ .]*\\d+.*)|(\\d+.*))[,.\\s]+([a-zA-Z]{2})[,.\\s]+(\\d{5}|\\d{5}-\\d{4})$',1,1,'is',1)) as test
from values(TRIM('FIRST SECOND THIRD PO BOX 123 DUMMY XX 12345-6789'));

--请忽略regex的后半部分,因为我正在获取地区代码和邮政编码,它们工作正常。
上面的查询返回“first second third po box”,如果返回第二组,则返回“123 dummy”
我想要的是:
案例1-当我的字符串是'first second third po box 123 dummy xx 12345-6789'
第一组输出:“第一第二第三”
第二组输出:“邮箱123”
案例2-当我的字符串是'first second third fifth 123 dummy xx 12345-6789'
第一组输出:“第一第二第三第四第五”
第二组输出:“123假人”
请建议在这里解决雪花,因为它没有懒惰的功能。
如果你想在regex101中验证,请粘贴下面的代码和测试字符串。当您切换到ungreedy时,您将看到结果(^\d*)((\bp[ost][.]o[office][.]b[ox][.]\d+)|(\d+)[,.\s]+([a-za-z]{2})[,.\s]+(\d{5}{d{5}-\d{4})$
测试字符串:第一第二第三邮政信箱123 xx 12345-6789
谢谢

pzfprimi

pzfprimi1#

编写javascrip自定义项始终是一个选项,然后您可以使用您的正则表达式:

create or replace function parse_address(F STRING)
    returns VARIANT
    language JAVASCRIPT
    immutable
    as $$
    const regex = /(^\D*)((\bP[OST]*[ .]*O[FFICE]*[ .]*B[OX]*[ .]*\d+.*)|(\d+.*))[,.\s]+([a-zA-Z]{2})[,.\s]+(\d{5}|\d{5}-\d{4})$/gm;
    let m = regex.exec(F);
    return [m[1], m[2]];
$$;

用法:

select parse_address($1)
from values('FIRST SECOND THIRD PO BOX 123 DUMMY XX 12345-6789')
    , ('FIRST SECOND THIRD FOURTH FIFTH 123 DUMMY XX 12345-6789')
;

相关问题