參考維基百科、Hadoop Hive概念學(xué)習(xí)系列之hive的正則表達(dá)式初步(六)和Hive 正則匹配函數(shù)
之前沒(méi)有在意過(guò)正則表達(dá)式,但是工作組不可避免的遇到了,感覺(jué)也比較重要,就花點(diǎn)時(shí)間理解一下。
一、正則表達(dá)式簡(jiǎn)介
正則表達(dá)式的目的:對(duì)字符串str進(jìn)行解析,用正則表達(dá)式(pattern)進(jìn)行匹配,并得到我們想要的符合模板pattern的字符串。
一個(gè)正則表達(dá)式通常被稱(chēng)為一個(gè)模式(pattern),為用來(lái)描述或者匹配一系列匹配某個(gè)句法規(guī)則的字符串。例如:Handel、H?ndel和Haendel這三個(gè)字符串,都可以由H(a|?|ae)ndel這個(gè)模式來(lái)描述。
同一個(gè)正則表達(dá)式可以匹配多個(gè)字符串。
例如,goo+gle可以匹配google、gooogle、goooogle等
0*42可以匹配42、042、0042、00042等。
反過(guò)來(lái)說(shuō),對(duì)于google、gooogle、goooogle我們都可以用正則表達(dá)式“goo+gle”匹配得到。而google、gooogle、goooogle就算我們想要的符合模板pattern的字符串。
二、hive正則表達(dá)式匹配函數(shù)
舉兩個(gè)經(jīng)常用到的:regexp_extract 與 regexp_replace
2.1、regexp_extract函數(shù)
regexp_extract(str, regexp[, idx]) 字符串正則表達(dá)式解析函數(shù)。
extracts a group that matches regexp
參數(shù)解釋?zhuān)?/p>
str是被解析的字符串或字段名
regexp 是正則表達(dá)式
idx是返回結(jié)果 取表達(dá)式的哪一部分 默認(rèn)值為1。
其中還有幾個(gè)符號(hào)與idx需要注意的地方。
小括號(hào)( )標(biāo)記一個(gè)子表達(dá)式的開(kāi)始與結(jié)束的位置。
**1表示返回正則表達(dá)式中第一個(gè)() 對(duì)應(yīng)的結(jié)果 **。
2表示返回正則表達(dá)式中第二個(gè)() 對(duì)應(yīng)的結(jié)果
0表示把整個(gè)正則表達(dá)式對(duì)應(yīng)的結(jié)果全部返回
舉例:
hive> select regexp_extract('IloveYou','(I)(.*?)(You)',1) from test1 limit 1;
Total jobs = 1
...
OK
I
Time taken: 26.057 seconds, Fetched: 1 row(s)
返回第一個(gè)()對(duì)應(yīng)的結(jié)果。
hive> select regexp_extract('IloveYou','I(.*?)(You)',1) from test1 limit 1;
Total jobs = 1
...
Total MapReduce CPU Time Spent: 7 seconds 340 msec
OK
love
Time taken: 28.067 seconds, Fetched: 1 row(s)
此時(shí),第一個(gè)()中對(duì)應(yīng)結(jié)果是love,所以返回“l(fā)ove”。
hive> select regexp_extract('IloveYou','(I)(.*?)(You)',0) from test1 limit 1;
Total jobs = 1
...
OK
IloveYou
Time taken: 28.06 seconds, Fetched: 1 row(s)
因?yàn)閕dx是0,所以返回整個(gè)正則表達(dá)式匹配的結(jié)果。
2.1、regexp_replace函數(shù)
語(yǔ)法: regexp_replace(string A, string B, string C)
返回值: string
說(shuō)明:將字符串A中的符合Java正則表達(dá)式B的部分替換為C。
注意,在有些情況下要使用轉(zhuǎn)義字符,類(lèi)似Oracle中的regexp_replace函數(shù)。
舉例說(shuō)明:
把A中符合正則表達(dá)式B的部分(這里為You)替換為C(這里為空字符串“”)
hive> select regexp_replace("IloveYou","You","") from test1 limit 1;
Total jobs = 1
...
OK
Ilove
Time taken: 26.063 seconds, Fetched: 1 row(s)
把A中符合正則表達(dá)式B的部分(這里為You)替換為C(這里為字符串“l(fā)inlin”)
hive> select regexp_replace("IloveYou","You","lili") from test1 limit 1;
Total jobs = 1
...
OK
Ilovelinlin