【数据库】Hive SQL 正则表达式进阶二(regexp_extract函数进阶使用)
生活随笔
收集整理的這篇文章主要介紹了
【数据库】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結果如下:前兩種能解析出來,后兩種解析不出
這是因為,后面兩種沒有逗號,所以是不匹配的
| Range | 30 | ? |
那有人會說,我把逗號去掉,數(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結果:
| 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結果:
| ? | ? | ? |
看一下填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結果:
| 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函数进阶使用)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 远程连接工具
- 下一篇: SQL 正则表达式