【Netezza】正则函数

       最近遇到了些数据清洗的问题,很多时候需要使用到模糊匹配,因此专门对Netezza中包含的正则函数进行了简单的整理。Netezza中包含的正则函数可以对字符进行模糊查找,替换,截取等,这里需要注意Netezza使用的是PCRE,即perl 兼容的正则表达式库,有些元字符并不支持,比如用于处理Unicode字符的“\u”,所以处理中文日文等时需要使用其它方法,例如使用元字符“\x”或者“\p”。Netezza常用函数通常包含以下参数:

  • Input :指定正则函数处理的字符;
  • Pattern 正则表达式;
  • Replacement 使用该字符替换匹配pattern的字符;
  • Start pos : 开始进行匹配的位置,默认为1;
  • Reference: 指定匹配到的第几个字符,默认为1,替换时默认为0,表示替换
  • flags: 可选参数,用于一些补充设置
      -m,  将字符串作为多行处理,此时^可以匹配“\n”或“\r”之后的位置,$可以匹配“\n”或“\r”之前的位置,等价于Perl的/m修饰符;
      -i,   指定不区分大小写的匹配,等价于Perl的/i修饰符;
      -c,  指定区分大小写的匹配;
      -s,  允许匹配任何字符的通配符’.’匹配换行符,如果省略此参数,则不能匹配换行符,等价于Perl的 /s修饰符;
      -n,  等价于修饰符s, 保持与其他正则表达式引擎的兼容性;
      -x,  忽略字符中的空格,等价于Perl的/x修饰符;
      -u,  指定输入字符为UTF-8编码,等价于Perl的/u修饰符;

以下简要介绍各个函数的使用方法.

1)      替换函数
语法 :regexp_replace(input,pattern, replacement, start_pos, reference, flag);
从原字符串中替换匹配的字符。
#替换全部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 :)





你可能感兴趣的:(Netezza)