Hive正则表达式案例
一、元字符
(摘自百度百科)
| . | 匹配除“\n”和"\r"之外的任何單個字符 |
| [a-z] | 字符范圍,匹配指定范圍內的任意字符 |
| [0-9] | 數字集合,匹配0到9的任意數字 |
| [xyz] | 字符集合,匹配所包含的任意一個字符,x、y、z可為任意字符,[]內()無意義 |
| | | 或,[x|y]匹配x或y,等價于[xy] |
| ^ | ^僅在[]內表示取反,如[^xyz] 為不包含x或y或z的任意字符,[^a-z]為不含包英文字母a到z的任意字符, ^[0-9]為任意非數字 |
| \d | 匹配一個數字字符,等價于[0-9] |
| \D | 匹配一個非數字字符,等價于[^0-9] ,將字母大寫表示在原意下取反,下同 |
| \w | 匹配包括下劃線的任何單詞字符,等價于[A-Za-z0-9_](經核驗非英文字符已不受影響,完全等價) |
| \W | 匹配任何非單詞字符。等價于[^A-Za-z0-9_] |
| \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]。 |
| \S | 匹配任何可見字符,等價于[^ \f\n\r\t\v] 。 |
| \t | 匹配一個制表符,等價于\x09和\cI |
| \v | 匹配一個垂直制表符,等價于\x0b和\cK |
| * | 匹配前面的子表達式任意次 |
| + | 匹配前面的子表達式一次或多次(大于等于1次) |
| ? | 匹配前面的子表達式零次或一次 ;當該字符緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})后面時,匹配模式是非貪婪的。非貪婪模式盡可能少地匹配所搜索的字符串,而默認的貪婪模式則盡可能多地匹配所搜索的字符串 |
| {n} | 匹配確定的n次 |
| {n,} | 至少匹配n次 |
| ^ | 匹配輸入字行首或取反 |
| $ | 匹配輸入行尾 |
| \b | 匹配一個單詞的邊界,也就是指單詞和空格間的位置(即正則表達式的“匹配”有兩種概念,一種是匹配字符,一種是匹配位置,這里的\b就是匹配位置的) |
| \B | 匹配非單詞邊界 |
| (?:pattern) | 非獲取匹配,匹配pattern但不獲取匹配結果,不進行存儲供以后使用 |
| (?=pattern) | 非獲取匹配,正向肯定預查,在任何匹配pattern的字符串開始處匹配查找字符串,該匹配不需要獲取供以后使用 |
| (?!pattern) | 非獲取匹配,正向否定預查,在任何不匹配pattern的字符串開始處匹配查找字符串,該匹配不需要獲取供以后使用 |
| (?<=pattern) | 非獲取匹配,反向肯定預查,與正向肯定預查類似,只是方向相反 |
| (?<!pattern) | 非獲取匹配,反向否定預查,與正向否定預查類似,只是方向相反 |
二、案例
hive正則可以在regexp_extract、regexp_replace等函數中使用,具體案例如下:
(以下案例如要為方法展示,未必是最優解,如有疏漏,歡迎斧正)
案例一:簡單匹配電話號碼(涉及位置、循環匹配)
匹配出電話號碼,電話號碼必須1開頭且為11位,即表中第1、3、5條記錄
| 185****2546 | 1 |
| 182****25466 | 2 |
| 150****6623 | 3 |
| 550****9542 | 4 |
| 136****7053 | 5 |
關鍵代碼解讀:
1)國內電話號碼已1開頭,且第二位在3-9之間,所以有^1[3-9]
2)除上述兩位數字外,其余還有9位,所以有\d{9},且以加上結尾符號$
3)可以使用或條件進行更加嚴格的手機號匹配
案例二:匹配系統型號(涉及或、循環、非獲取匹配)
匹配系統名稱,安卓系統版本大于5.0,IOS系統版本大于6.0,即表中第2、4、5條記錄
| android5.1.5 | 1 |
| android7.1.2 | 2 |
| ios6.6 | 3 |
| ios8.1 | 4 |
| ios11.4 | 5 |
關鍵代碼解讀:
1)要同時匹配android和ios,所以使用“|”做或處理
2)需要匹配系統名稱但不需要系統版本,所以使用非獲取匹配(?=pattern),即查找字符但不獲取
3)因安卓系統版本大于5.0,IOS系統版本大于6,所以android后接6-9或者10-99,ios同理
4)因系統版本有子版本,對點加數字([.0-9])做貪婪匹配
案例三:匹配多次出現字符(反向引用)
某投球活動,有四個命中點,用戶第一次投中某命中點后,后續至少再投中該點兩次,一共四次機會,匹配出所有完成任務的記錄,即第1、4條記錄
| aaba | 1 |
| abac | 2 |
| bdab | 3 |
| dddd | 4 |
| cdab | 5 |
關鍵代碼解讀:
1)通過()可以將匹配到的內容作為一個整體,該過程即為捕獲組,捕獲組中的內容在正則表達式內部進行引用即反向引用
2)\1表示第一個()匹配到的內容,如果有第二個()則可用\2表示第二個()匹配到的內容,后續同理
總結
以上是生活随笔為你收集整理的Hive正则表达式案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: crm如何做好客户关系管理?
- 下一篇: Linux mkdir文件已存在,Lin