hive 正则表达式
https://www.runoob.com/regexp/regexp-syntax.html
正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。
把一個由子母和數字組成的字符串,提取所有的字母串和數字串。簡單想了下可以寫udf解決,也可以用正則處理。采用正則處理的實例如下:
--字符串'sdfsd1232sdf324',拆成'sdfsd','1232','sdf','324'
select explode(split(regexp_replace('sdfsd1232sdf324','[0-9]+',','),','))
union all?
select explode(split(regexp_replace('sdfsd1232sdf324','[a-z]+',','),','))
該問題解決起來不算難,借著這個問題想要整理下Hive中的正則表達式的使用。
正則表達式基本語法
普通字符
普通字符包括沒有顯示指定為元字符的所有可打印和不可打印字符。這包括所有大寫和小寫字母,所有數字,所有標點符號和其他一些符號。
非打印字符
非打印字符也可以是正則表達式的組成部分。下面列出表示非打印字符的轉義序列:
| \cx | 匹配由x指明的控制字符。例如, \cM 匹配一個 Control-M 或回車符。x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個原義的 'c' 字符。 |
| \f | 匹配一個換頁符。等價于\x0c 和\cL |
| \n | 匹配一個換行符。等價于\x0a和\cJ |
| \r | 匹配一個回車符。等價于\x0d和\cM |
| \s | 匹配任何空白字符,包括空格、制表符、換頁符等等。等價于 [ \f\n\r\t\v]。注意 Unicode 正則表達式會匹配全角空格符。 |
| \S | 匹配任何非空白字符。等價于 [^ \f\n\r\t\v]。 |
| \t | 匹配一個制表符。等價于 \x09 和 \cI |
| \v | 匹配一個垂直制表符。等價于 \x0b 和 \cK |
特殊字符
所謂特殊字符,就是有一些特殊含義的字符,需要在試圖匹配它們時特別對待。若要匹配這些特殊字符,必須首先使字符“轉義”。
| $ | 匹配輸入字符串的結尾位置。如果設置了 RegExp 對象的 Multiline 屬性,則??字符本身,請使用 \$ |
| () | 標記一個子表達式的開始和結束位置。子表達式可以獲取供以后使用。要匹配這些字符,請使用?和和 |
| * | 匹配前面的子表達式零次或多次。要匹配 * 字符,請使用 \* |
| + | 匹配前面的子表達式一次或多次。要匹配 + 字符,請使用 \+ |
| . | 匹配除換行符 \n 之外的任何單字符。要匹配 . ,請使用 \. |
| [ | 標記一個中括號表達式的開始。要匹配 [,請使用 \[ |
| ? | 匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字符,請使用 \? |
| \ | 將下一個字符標記為或特殊字符、或原義字符、或向后引用、或八進制轉義符。例如, 'n' 匹配字符 'n'。'\n' 匹配換行符。序列 '\\' 匹配 "\",而 '\(' 則匹配 "(" |
| ^ | 匹配輸入字符串的開始位置,除非在方括號表達式中使用,此時它表示不接受該字符集合。要匹配 ^ 字符本身,請使用 \^ |
| { | 標記限定符表達式的開始。要匹配 {,請使用 \{ |
| | | 指明兩項之間的一個選擇。要匹配 |,請使用 \| |
限定符
限定符用來指定正則表達式的一個給定組件必須要出現多少次才能滿足匹配。正則表達式的限定符有:
| * | 匹配前面的子表達式零次或多次。例如,ap* 能匹配 "a" 以及 "apple"。* 等價于{0,} |
| + | 匹配前面的子表達式一次或多次。例如,'ap+' 能匹配 "ap" 以及 "apple",但不能匹配 "a"。+ 等價于 {1,} |
| ? | 匹配前面的子表達式零次或一次。例如,"app(le)?" 可以匹配 "app" 、 "apple" 。? 等價于 {0,1} |
| {n} | n 是一個非負整數。匹配確定的 n 次。例如,'ap{2}不能匹配"ape",但能匹配"app" |
| {n,} | n 是一個非負整數。至少匹配n 次 |
| {n,m} | m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次 |
*,+限定符都是貪婪的,因為它們會盡可能多的匹配文字,只有在它們的后面加上一個?就可以實現非貪婪或最小匹配。
定位符
定位符能夠將正則表達式固定到行首或者行尾,還能定位在一個單詞內部或者開頭或者結尾。正則表達式的定位符有:
| ^ | 匹配輸入字符串開始的位置 |
| $ | 匹配輸入字符串結尾的位置 |
| \b | 匹配一個字邊界,即字與空格間的位置 |
| \B | 非字邊界匹配 |
選擇
用圓括號將所有選擇項括起來,相鄰的選擇項之間用|分隔。但用圓括號會有一個副作用,使相關的匹配會被緩存,此時可用?:放在第一個選項前來消除這種副作用。
其中 ?: 是非捕獲元之一,還有兩個非捕獲元是 ?= 和 ?!,這兩個還有更多的含義,前者為正向預查,在任何開始匹配圓括號內的正則表達式模式的位置來匹配搜索字符串,后者為負向預查,在任何開始不匹配該正則表達式模式的位置來匹配搜索字符串。
反向引用
對反向引用目前還未深入了解,之后如遇到實際使用,會再來補充。
在Hive中的使用
- regexp_extract
語法:regexp_extract(string subject,string pattern,int index)
返回值:string
說明:將字符串subject按照pattern正則表達式的規則拆分,返回指定index的字符
- regexp_replace
語法:regexp_replace(string a,string b,string c)
返回值:string
說明:將字符串a中的符合正則表達式b的部分替換成c
hive中的正則表達式還是很強大的。數據工作者平時也離不開正則表達式。對此,特意做了個hive正則表達式的小結。所有代碼都經過親測,正常運行。
1.regexp
語法: A REGEXP B
操作類型: strings
描述: 功能與RLIKE相同
與下面查詢的效果是等效的:
select count(*) from olap_b_dw_hotelorder_f where create_date_wid not rlike '\\d{8}';2.regexp_extract
語法: regexp_extract(string subject, string pattern, int index)
返回值: string
說明:將字符串subject按照pattern正則表達式的規則拆分,返回index指定的字符。
3.regexp_replace
語法: regexp_replace(string A, string B, string C)
返回值: string
說明:將字符串A中的符合java正則表達式B的部分替換為C。注意,在有些情況下要使用轉義字符,類似oracle中的regexp_replace函數。
總結
以上是生活随笔為你收集整理的hive 正则表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开关电源的优缺点
- 下一篇: MYSQL ifnull 函数 、if判