Hql 和 SparkSql - 使用正则关键字(like、rlike、regexp、regexp_replace、regexp_extract)
最编程
2024-04-01 19:55:52
...
文章目录
- 简述
- 正则的通配符简介
- 正则表达式的符号及意义
- 字符簇:
- 各种操作符的运算优先级:
- Hql、SparkSql支持的正则关键字
- LIKE
- RLIKE
- REGEXP
- REGEXP_REPLACE
- REGEXP_EXTRACT
- 特别说明
简述
笔者在最近的工作中使用的较为频繁,特此做下总结,最近遇到的某些数据的值十分脏乱,用正则表达式的话会让语句显得特别精简,也可以用各种字符串截取函数嵌套处理(必须要有一定规律),总结一下经常用到的几个。
正则的通配符简介
正则表达式的符号及意义
通配符 | 意义 |
---|---|
\ | 做为转义,即通常在"/“后面的字符不按原来意义解释,如/b/匹配字符"b”,当b前面加了反斜杆后//b/,转意为匹配一个单词的边界。 -或- 对正则表达式功能字符的还原,如""匹配它前面元字符0次或多次,/a/将匹配a,aa,aaa,加了"/“后,/a//将只匹配"a”。 |
. | 表示任意字符 |
^ | 匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a" |
$ | 匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A" |
* | 匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa |
+ | 匹配前面元字符1次或多次,/ba*/将匹配ba,baa,baaa |
? | 匹配前面元字符0次或1次,/ba*/将匹配b,ba |
(x) | 匹配x保存x在名为$1…$9的变量中 |
x|y | 匹配x或y |
{n} | 精确匹配n次 |
{n,} | 匹配n次以上 |
{n,m} | 匹配n-m次 |
[xyz] | 字符集(character set),匹配这个集合中的任一一个字符(或元字符) |
[^xyz] | 不匹配这个集合中的任何一个字符 |
[\b] | 匹配一个退格符 |
\b | 匹配一个单词的边界 |
\B | 匹配一个单词的非边界 |
\cX | 这儿,X是一个控制符,//cM/匹配Ctrl-M |
\d | 匹配一个字数字符,//d/ = /[0-9]/ |
\D | 匹配一个非字数字符,//D/ = /[^0-9]/ |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\s | 匹配一个空白字符,包括/n,/r,/f,/t,/v等 |
\S | 匹配一个非空白字符,等于/[^/n/f/r/t/v]/ |
\t | 匹配一个制表符 |
\v | 匹配一个重直制表符 |
\w | 匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[/w]匹配"$5.98"中的5,等于[a-zA-Z0-9] |
\W | 匹配一个不可以组成单词的字符,如[/W]匹配" 5.98 " 中 的 5.98"中的 5.98"中的,等于[^a-zA-Z0-9]。 |
‘( )’ | 标记一个子表达式的开始和结束位置。 |
‘[]’ | 标记一个中括号表达式。 |
\num | 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。 |
注:空格使用
'^$'
表示
字符簇:
字符簇 | 解释 |
---|---|
[[:alpha:]] | 任何字母 |
[[:digit:]] | 任何数字 |
[[:alnum:]] | 任何字母和数字 |
[[:space:]] | 任何白字符 |
[[:upper:]] | 任何大写字母 |
[[:lower:]] | 任何小写字母 |
[[:punct:]] | 任何标点符号 |
[[:xdigit:]] | 任何16进制的数字,相当于[0-9a-fA-F] |
[[:<:]],[[:>:]] | 标记表示word边界。它们分别与word的开始和结束匹配。word是一系列字字符,其前面和后面均没有字字符。字字符是alnum类中的字母数字字符或下划线(_) |
各种操作符的运算优先级:
\ 转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, anymetacharacter 位置和顺序
Hql、SparkSql支持的正则关键字
LIKE
模糊匹配的关键字。
- 语法1:
A LIKE B
- 语法2:
LIKE(A, B)
- 操作类型:
strings
- 返回类型:
boolean或null
- 描述:
如果字符串A或者字符串B为NULL,则返回NULL;
如果字符串A符合表达式B的正则语法,则为TRUE;否则为FALSE。只能使用简单匹配符号 % 和 _,其中 % 表示0-n个字符,而 _ 表示任意1个字符(当然 _ 可以有多个,有几个 _ 就表示几个字符)
。
hive> select 'football' like '%ba';
OK
false
hive> select 'football' like '%ba%';
OK
true
hive> select 'football' like '__otba%';
OK
true
hive> select like('football', '__otba%');
OK
true
RLIKE
- 语法1:
A RLIKE B
- 语法2:
RLIKE(A, B)
- 操作类型:
strings
- 返回类型:
boolean或null
- 描述:
如果字符串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
true
hive> select 'does' rlike 'do(es)?';
OK
true
hive> select '\\';
OK
\
hive> select '2314' rlike '\\d+';
OK
true
REGEXP
语法1:
A REGEXP B
语法2:REGEXP(A, B)
操作类型:strings
返回类型:boolean或null
描述: 如果字符串A或者字符串B为NULL,则返回NULL;
如果字符串A符合JAVA正则表达式B
的正则语法,则为TRUE;否则为FALSE。
hive> select 'football' regexp 'ba';
OK
true
hive> select 'football' regexp '^footba';
OK
true
hive> select regexp('football', 'ba');
OK
true
REGEXP_REPLACE
语法:
regexp_replace(string A, string B, string C)
操作类型:strings
返回值:string
说明: 将字符串A中的符合java正则表达式B
的部分替换为C。
hive> select regexp_replace('h234ney', '\\d+', 'o');
OK
honey
REGEXP_EXTRACT
语法:
regexp_extract(string A, string pattern, int index)
返回值:string
说明:将字符串A按照pattern正则表达式的规则拆分,返回index指定的字符,index从1开始计。
hive> select regexp_extract('honeymoon', 'hon(.*?)(moon)', 0);
OK
honeymoon
hive> select regexp_extract('honeymoon', 'hon(.*?)(moon)', 1);
OK
ey
hive> select regexp_extract('honeymoon', 'hon(.*?)(moon)', 2);
OK
moon
特别说明
Oralce
中regex_like
和hive
的regexp
对应。
-- 以J或K或N开头 -- oracle,impala语法
select regexp_like('JFAF', '^ [JKN]');
-- hive语法
select 'JFAF' regexp '^ [JKN]';