日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hive正则表达式案例

發布時間:2024/3/12 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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條記錄

TElautoid
185****25461
182****254662
150****66233
550****95424
136****70535
select regexp_extract(lower(tel),'(^1[3-9]\\d{9}$)',0) as tel_number;

關鍵代碼解讀:
1)國內電話號碼已1開頭,且第二位在3-9之間,所以有^1[3-9]
2)除上述兩位數字外,其余還有9位,所以有\d{9},且以加上結尾符號$
3)可以使用或條件進行更加嚴格的手機號匹配

案例二:匹配系統型號(涉及或、循環、非獲取匹配)
匹配系統名稱,安卓系統版本大于5.0,IOS系統版本大于6.0,即表中第2、4、5條記錄

valueautoid
android5.1.51
android7.1.22
ios6.63
ios8.14
ios11.45
select regexp_extract(lower(value),'((android)(?=([6-9]|[1-9][0-9])[.0-9]+))|((ios)(?=([8-9]|[1-9][0-9])[.0-9]+))',0) as osname;

關鍵代碼解讀:
1)要同時匹配android和ios,所以使用“|”做或處理
2)需要匹配系統名稱但不需要系統版本,所以使用非獲取匹配(?=pattern),即查找字符但不獲取
3)因安卓系統版本大于5.0,IOS系統版本大于6,所以android后接6-9或者10-99,ios同理
4)因系統版本有子版本,對點加數字([.0-9])做貪婪匹配

案例三:匹配多次出現字符(反向引用)
某投球活動,有四個命中點,用戶第一次投中某命中點后,后續至少再投中該點兩次,一共四次機會,匹配出所有完成任務的記錄,即第1、4條記錄

resultautoid
aaba1
abac2
bdab3
dddd4
cdab5
select regexp_extract(result,'(^[a-d]).?\\1.?\\1.?',0) as tel_number;

關鍵代碼解讀:
1)通過()可以將匹配到的內容作為一個整體,該過程即為捕獲組,捕獲組中的內容在正則表達式內部進行引用即反向引用
2)\1表示第一個()匹配到的內容,如果有第二個()則可用\2表示第二個()匹配到的內容,后續同理

總結

以上是生活随笔為你收集整理的Hive正则表达式案例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。