最近遇到了些数据清洗的问题,很多时候需要使用到模糊匹配,因此专门对Netezza中包含的正则函数进行了简单的整理。Netezza中包含的正则函数可以对字符进行模糊查找,替换,截取等,这里需要注意Netezza使用的是PCRE,即perl 兼容的正则表达式库,有些元字符并不支持,比如用于处理Unicode字符的“\u”,所以处理中文日文等时需要使用其它方法,例如使用元字符“\x”或者“\p”。Netezza常用函数通常包含以下参数:
以下简要介绍各个函数的使用方法.
#替换全部Red为Orange
select regexp_replace('Red Yellow Blue Red Green Blue','Red','Orange');
#从第一个字符开始匹配,替换匹配到的第二个Red为Orange
select regexp_replace('Red Yellow Blue Red Green Blue','Red','Orange', 1, 2);
#从第一个字符开始匹配,在匹配到的第一个字符前添加Colors
select regexp_replace('Red Yellow Blue Red Green Blue','(Red)', 'Colors: \1', 1, 1);
#替换所有的非单词字符\W(字母数字下划线),以及所有的不可见字符\s
select regexp_replace('Red,Yellow (Blue) Red|Green&Blue','[\W\s_]+', ' ');
2) 提取函数
语法: regexp_extract(input,pattern , start_pos, reference, flag);从原字符串中提取匹配的字符。
#从第一个字符匹配,并提取第一个匹配到的字符
select regexp_extract('hello to you', '.o', 1, 1);
select regexp_extract('hello to you', '.o');
#从第一个字符匹配,并提取第二个匹配到的字符
select regexp_extract('hello to you', '.o', 1, 2);
#从第一个字符匹配,并提取第三个匹配到的字符
select regexp_extract('hello to you', '.o', 1, 3);
语法:regexp_extract_all(input,pattern, start_pos, flag);从原字符串中提取所有匹配的字符,返回字符数组。
#返回匹配到的所有字符,对返回的数据元素使用|连接
Select array_combine(regexp_extract_all('Steven .Stephen is the best player','Ste(v|ph)en'), '|');
3) 查询匹配函数
语法: regexp_instr(input,pattern , start_pos, reference, flag);返回匹配的字符在源字符串中的位置,如果匹配不到或者匹配到的字符个数少于Reference设置的值,返回0。
#从第一个字符匹配,返回匹配到的第一个字符的位置
select regexp_instr('hello to you', '.o', 1, 1);
#从第一个字符匹配,返回匹配到的第二个字符的位置
select regexp_instr('hello to you', '.o', 1, 2);
#从第一个字符匹配,返回匹配到的第三个字符的位置
select regexp_instr('hello to you', '.o', 1, 3);
#从第一个字符匹配,返回匹配到的第四个字符的位置
select regexp_instr('hello to you', '.o', 1, 4);
#从第一个字符匹配,返回匹配到的中文的位置,必须包含‘u’指定输入字符UTF-8编码
select regexp_instr('hello 你好','[\p{Han}]+', 'u');
select regexp_instr('hello 你好','[\x{4e00}-\x{9fa5}]+', 'u');
注:Unicode字符范围查找https://unicode-table.com/cn/#cjk-unified-ideographs
语法:regexp_like(input,pattern , start_pos, flag);
对源数据进行模糊查找,一般用于where条件,返回匹配的记录数。
#包含匹配的字符则返回TRUE
select regexp_like('my password is 09124 or 069az6','[0-9][^0-9]+[0-9]$');
#包含匹配的字符则返回TRUE,忽略大小写
select regexp_like('my password is 09124 or 069az6', '[\s]{2,}', 'i')
语法:regexp_match_count(input,pattern, start_pos);返回匹配到的字符数量。
#返回匹配到的字符的数量
select regexp_match_count('Steven Jones and Stephen Smith are the best players','Ste(v|ph)en');
以上为Netezza中正则函数的简单介绍,结合具体的正则表达式可以实现丰富的字符处理,enjoy :)