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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

【数据库】Hive SQL 正则表达式进阶二(regexp_extract函数进阶使用)

發(fā)布時間:2023/12/14 数据库 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据库】Hive SQL 正则表达式进阶二(regexp_extract函数进阶使用) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? ? ? ?在之前文章中(文章如下),小白有講過正則的三個函數(shù),替換、截取等操作。在工作中,又遇到了其他的問題,這里做一個進階的講解文章,歡迎遇到類似問題的小伙伴一起學習交流。

初級用法參照下面的文章

Hive SQL 正則表達式進階一(regexp的三個函數(shù))https://blog.csdn.net/Jarry_cm/article/details/87272189

場景一

有以下幾種情況的數(shù)據(jù),需要將15|后面的內容取出來,后面有可能是英文,有可能是數(shù)字,位置不固定。

我們看下幾種SQL的形式:

第一種:

select regexp_extract('15|Range,16|5,31|369728,17|1',"(15\\|)(.*?)(,)",2) as r1,regexp_extract('16|5,15|30,31|369728,17|1',"(15\\|)(.*?)(,)",2) as r2,regexp_extract('16|5,31|369728,17|1,15|Range',"(15\\|)(.*?)(,)",2) as r3,regexp_extract('15|30',"(15\\|)(.*?)(,)",2) as r4

結果如下:前兩種能解析出來,后兩種解析不出

這是因為,后面兩種沒有逗號,所以是不匹配的

r1r2r3r4
Range30?

那有人會說,我把逗號去掉,數(shù)字變?yōu)?不就好了么,OK來試一下

第二種:這里需要注意一下? .*? ?表示匹配任意字符到下一個符合條件的字符,這里把后面的逗號去掉了,那就從來都不會滿足該條件,因此,無論哪種形式,第二個位置都不會匹配出來

看一下填1

select regexp_extract('15|Range,16|5,31|369728,17|1',"(15\\|)(.*?)",1) as r1,regexp_extract('16|5,15|30,31|369728,17|1',"(15\\|)(.*?)",1) as r2,regexp_extract('16|5,31|369728,17|1,15|Range',"(15\\|)(.*?)",1) as r3,regexp_extract('15|30',"(15\\|)(.*?)",1) as r4

結果:

r1r2r3r4
15|15|15|15|

?看一下填2

select regexp_extract('15|Range,16|5,31|369728,17|1',"(15\\|)(.*?)",2) as r1,regexp_extract('16|5,15|30,31|369728,17|1',"(15\\|)(.*?)",2) as r2,regexp_extract('16|5,31|369728,17|1,15|Range',"(15\\|)(.*?)",2) as r3,regexp_extract('15|30',"(15\\|)(.*?)",2) as r4

結果:

r1r2r3r4
???

看一下填0,0是符合所有條件的結果,第二個永遠遍歷不完,所以結果和填1是一樣的

select regexp_extract('15|Range,16|5,31|369728,17|1',"(15\\|)(.*?)",0) as r1,regexp_extract('16|5,15|30,31|369728,17|1',"(15\\|)(.*?)",0) as r2,regexp_extract('16|5,31|369728,17|1,15|Range',"(15\\|)(.*?)",0) as r3,regexp_extract('15|30',"(15\\|)(.*?)",0) as r4

結果:

r1r2r3r4
15|15|15|

15|

?

?因此,這里們要分析,豎線后面有哪些形式,英文或者是數(shù)字,那么第二個匹配我們應該匹配英文或數(shù)據(jù),那下面寫法就可以達到目的了。

select regexp_extract('15|Range,16|5,31|369728,17|1',"15\\|(([A-Za-z]{1,})|(\\d{1,}))",1) as r1,regexp_extract('16|5,15|30,31|369728,17|1',"15\\|(([A-Za-z]{1,})|(\\d{1,}))",1) as r2,regexp_extract('16|5,31|369728,17|1,15|Range',"15\\|(([A-Za-z]{1,})|(\\d{1,}))",1) as r3,regexp_extract('15|30',"15\\|(([A-Za-z]{1,})|(\\d{1,}))",1) as r4,regexp_extract('15|Range',"15\\|(([A-Za-z]{1,})|(\\d{1,}))",1) as r5,regexp_extract('16|5,15|Range,31|369728,17|1',"15\\|(([A-Za-z]{1,})|(\\d{1,}))",1) as r6

總的來說,正則中有很多小知識點,做正則時除了需要細心,掌握每種可能的情況,才能正確的解析。

總結

以上是生活随笔為你收集整理的【数据库】Hive SQL 正则表达式进阶二(regexp_extract函数进阶使用)的全部內容,希望文章能夠幫你解決所遇到的問題。

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