目錄
- 背景
- 一、正則的通配符簡介
-
- 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