欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

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

特别说明

Oralceregex_likehiveregexp对应。

-- 以J或K或N开头 -- oracle,impala语法
select regexp_like('JFAF', '^ [JKN]');
-- hive语法
select 'JFAF' regexp '^ [JKN]';