天天看點

大資料之Hive:正規表達式背景一、正則的通配符簡介二、regexp函數三、regexp_extract函數四、regexp_replace函數

目錄

  • 背景
  • 一、正則的通配符簡介
    • 1、正規表達式的符号及意義
    • 2、字元簇:
    • 3、各種操作符的運算優先級:
  • 二、regexp函數
  • 三、regexp_extract函數
  • 四、regexp_replace函數

背景

最近在工作中,遇到一些比對,需要使用正規表達式,發現自己在這一塊知識有所欠缺,故總結一下;

一、正則的通配符簡介

1、正規表達式的符号及意義

符号 含義 實列
/ 做為轉意,即通常在"/"後面的字元不按原來意義解釋 如" * “比對它前面元字元0次或多次,/a*/将比對a,aa,aaa,加了”/"後,/a将比對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] 不比對這個集合中的任何一個字元
/d 比對一個字數字元 //d/ = /[0-9]/
/D 比對一個非字數字元 //D/ = /[^0-9]/
/s 比對一個空白字元,包括/n,/r,/f,/t,/v等
/S 比對一個非空白字元,等于/[^/n/f/r/t/v]/
/w 比對一個可以組成單詞的字元(alphanumeric,這是我的意譯,含數字),包括下劃線,如[/w]比對"$5.98"中的5,等于[a-zA-Z0-9]
/W 比對一個不可以組成單詞的字元,如[/W]比對"$5.98"中的 $,等于[^a-zA-Z0-9]

備注:

‘( )’ 标記一個子表達式的開始和結束位置。

‘[]’ 标記一個中括号表達式。

/num 比對 num,其中 num 是一個正整數。對所擷取的比對的引用。

2、字元簇:

[[:alpha:]] 任何字母。

[[:digit:]] 任何數字。

[[:alnum:]] 任何字母和數字。

[[:space:]] 任何白字元。

[[:upper:]] 任何大寫字母。

[[:lower:]] 任何小寫字母。

[[:punct:]] 任何标點符号。

[[:xdigit:]] 任何16進制的數字,相當于[0-9a-fA-F]

3、各種操作符的運算優先級:

轉義符>圓括号和方括号>限定符>位置和順序

具體如下:

/ 轉義符

(), ( ?: ), (?=), [] 圓括号和方括号

*, +, ?, {n}, {n,}, {n,m} 限定符

^, $, anymetacharacter 位置和順序

正規表達式的符号及意義

二、regexp函數

文法: A REGEXP B

操作類型: strings

描述: 功能與RLIKE相同

hive> select id,name,birthday,tea_list from stu_info where birthday regexp '\\d{8}';
id	name	birthday	tea_list
01	zhangsan	20000308	東邪|西毒|南帝|北丐
02	lisi	20040418	東邪|西毒|南帝
03	wangwu	20011008	西毒|南帝
hive> select id,name,birthday,tea_list from stu_info where tea_list regexp '東邪|北丐';
id	name	birthday	tea_list
01	zhangsan	20000308	東邪|西毒|南帝|北丐
02	lisi	20040418	東邪|西毒|南帝
hive> select id,name,birthday,tea_list from stu_info where birthday not rlike '\\d{8}';
id	name	birthday	tea_list
05	tianqi	1994-10-01	西毒|南帝
           

補充:like (模糊比對)與rlike的 差別

示例:

hive>select id,name,birthday,tea_list from stu_info where tea_list like '%東邪%';
id	name	birthday	tea_list
01	zhangsan	20000308	東邪|西毒|南帝|北丐
02	lisi	20040418	東邪|西毒|南帝
hive> select id,name,birthday,tea_list from stu_info where birthday not rlike '\\d{8}';
id	name	birthday	tea_list
05	tianqi	1994-10-01	西毒|南帝
           

首先需要明确的是like的内容不是正則,而是通配符。

而rlike的内容可以是正則,正則的寫法與java一樣。需要轉義,例如’\m’需要使用’\m’

1,%:表示任意0個或多個字元。可比對任意類型和長度的字元,有些情況下若是中文,請使用兩個百分号(%%)表示

2,_: 表示任意單個字元。比對單個任意字元,它常用來限制表達式的字元長度語句;

SELECT name FROM stu_info WHERE name LIKE '_三_';
SELECT name FROM stu_info WHERE name LIKE '三_';
           

3,[ ]:表示括号内所列字元中的一個(類似正規表達式)。指定一個字元、字元串或範圍,要求所比對對象為它們中的任一個。

4,[ ^ ] :表示不在括号所列之内的單個字元。其取值和 [] 相同,但它要求所比對對象為指定字元以外的任一個字元。

三、regexp_extract函數

文法: regexp_extract(string subject, string pattern, int index)

傳回值: string

說明:将字元串subject按照pattern正規表達式的規則拆分,傳回index指定的字元

idx是傳回結果 取表達式的哪一部分 預設值為1。

0表示把整個正規表達式對應的結果全部傳回

1表示傳回正規表達式中第一個() 對應的結果 以此類推。

hive> select regexp_extract('IloveYou','I(.*?)(You)',1) from test1 limit 1;
love
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_extract(create_time,'[0-9]{3}[1-9]-(0[1-9]|1[012])-[0-9]{2}',0) from time_table_1;
2021-08-14
2021-08-15
2021-08-16
           

四、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 limit 1;
Ilove
hive> select regexp_replace("IloveYou","You","lili") from test1 limit 1;
Ilovelili
hive>select date_format (regexp_replace('2017/05/21','/','-'),'yyyy-MM-dd') data_dt;
2017-05-21
           

參考:https://blog.csdn.net/bitcarmanlee/article/details/51106726