Hql&SparkSql——正则关键字的使用(like、rlike、regexp、regexp_replace、regexp_extract)

本文总结了正则表达式的通配符及其含义,介绍了字符簇和运算符优先级,并详细讲解了Hive和SparkSql中LIKE, RLIKE, REGEXP, REGEXP_REPLACE, REGEXP_EXTRACT的关键用法。适合处理脏乱数据的高效正则解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简述

笔者在最近的工作中使用的较为频繁,特此做下总结,最近遇到的某些数据的值十分脏乱,用正则表达式的话会让语句显得特别精简,也可以用各种字符串截取函数嵌套处理(必须要有一定规律),总结一下经常用到的几个。

正则的通配符简介

正则表达式的符号及意义

通配符意义
\做为转义,即通常在"/“后面的字符不按原来意义解释,如/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]';
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扫地增

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值