SQL专题(十四)hive中字符匹配—like|rlike|regexp|regexp_extract|regexp_replace

转自:

一、like|not like 比较符

语法:A like B
A 表示字符串,B是指表达式,只能使用简单匹配符号 %_,其中 % 表示0-n个字符,而 _ 表示任意1个字符(当然 _ 可以有多个,有几个 _ 就表示几个字符)

它表示能否用B去完全匹配A的内容,换句话说能否用B这个表达式去表示A的全部内容。返回的结果是True/False.

  1. B只能使用简单匹配符号 _和%,”_”表示任意单个字符,字符”%”表示任意数量的字符
  2. like的匹配是按字符逐一匹配的,使用B从A的第一个字符开始匹配,所以即使有一个字符不同都不行。
  3. 否定比较时候用NOT A LIKE B(使用A NOT LIIKE B也可以),结果与like的结果时相对的。

注意:A 或 B 为null,则返回null(即使两者都为null,也同样返回null)

hive (default)> select 'abcde' like 'abc';
OK
false

hive (default)> select null like '%';
OK
NULL

hive (default)> select 'abc' like null ;
OK
NULL
hive (default)> select 'abcde' like 'abc';
OK
false

hive (default)> select 'abcde' like 'abc__';
OK
true

hive (default)> select 'abcde' like 'abc%';
OK
true

hive (default)> select 'abcde' like '%abc%';
OK
true

hive (default)> select 'abcde' like 'bc%';
OK
false

hive (default)> select 'abcde' like '_bc%';
OK
true

hive (default)> select 'abcde' like '_b%';
OK
true

二、rlike|not rlike比较符

A RLIKE B ,表示B是否在A里面即可。而A LIKE B,则表示B是否是A.

B中的表达式可以使用JAVA中全部正则表达式,如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合JAVA正则表达式B的正则语法,则为TRUE;否则为FALSE。

hive> select 'football' rlike 'ba';
OK
true
hive> select 'football' rlike '^footba';
OK
true
hive> select rlike('football', 'ba');
OK


hive> select 'does' rlike 'do(es)?';
OK
true
hive> select '\\';
OK
\
hive> select '2314' rlike '\\d+';
OK
true

三、regexp|regexpextract|regexp_replace

正则表达式的常见匹配规则
1、元字符匹配
(.)   表示匹配除换行符以外的任意字符。
(\w) 表示匹配字母、下划线、数字或汉字(\\W)。
(\d) 表示匹配数字
(\s) 表示匹配任意的空白符
([ ])  表示匹配方括号中任一字符
([^匹配内容]) 表示不匹配方括号中任一字符

2、位置匹配
(^) 表示匹配字符串的开始,空值:^$
($) 表示匹配字符串的结束
(\b) 表示匹配单词的开始或结束。
(\B) 表示匹配非单词的开始或结束

3、频率匹配
(*) 表示匹配重复0次或多次
(+) 表示匹配重复一次或更多次
(?) 表示匹配重复0次或1次
({n}) 表示匹配重复n次
({n,}) 表示重复n次或更多次
({n,m}) 表示重复n到m次

4、字符簇: 
[[:alpha:]] 任何字母。
[[:digit:]] 任何数字。
[[:alnum:]] 任何字母和数字。
[[:space:]] 任何白字符。
[[:upper:]] 任何大写字母。
[[:lower:]] 任何小写字母。
[[:punct:]] 任何标点符号。
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]

regexp用法和rlike相同

regexp_extract(string subject, string pattern, int index)

返回值: string,将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。

hive> select regexp_extract('IloveYou','I(.*?)(You)',1) from test1 limit 1;
Total jobs = 1
Total MapReduce CPU Time Spent: 7 seconds 340 msec
ok
love
Time taken: 28.067 seconds, Fetched: 1 row(s)
hive> select regexp_extract('IloveYou','I(.*?)(You)',2) from test1 limit 1;
You
hive> select regexp_extract('IloveYou','(I)(.*?)(You)',1) from test1 limit 1;
I
hive> select regexp_extract('IloveYou','(I)(.*?)(You)',0) from test1 limit 1;
IloveYou
hive> select regexp_replace("IloveYou","You","") from test1 limit1;
Ilove


regexp_replace

语法: regexp_replace(string A, string B, string C) 返回值: string 说明:将字符串A中的符合Java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符,类似Oracle中的regexp_replace函数。

hive> select regexp_replace("IloveYou","You","") from test1 limit1;
Ilove
hive> select regexp_replace("IloveYou","You","lili") from test1 limit1;
Ilovelili

编辑于 2022-08-30 17:46