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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hive 正则表达式

發(fā)布時(shí)間:2024/3/12 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hive 正则表达式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

https://www.runoob.com/regexp/regexp-syntax.html

正則表達(dá)式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個(gè)串是否含有某種子串、將匹配的子串替換或者從某個(gè)串中取出符合某個(gè)條件的子串等。

把一個(gè)由子母和數(shù)字組成的字符串,提取所有的字母串和數(shù)字串。簡單想了下可以寫udf解決,也可以用正則處理。采用正則處理的實(shí)例如下:

  • --字符串'sdfsd1232sdf324',拆成'sdfsd','1232','sdf','324'

  • select explode(split(regexp_replace('sdfsd1232sdf324','[0-9]+',','),','))

  • union all?

  • select explode(split(regexp_replace('sdfsd1232sdf324','[a-z]+',','),','))

  • 該問題解決起來不算難,借著這個(gè)問題想要整理下Hive中的正則表達(dá)式的使用。

    正則表達(dá)式基本語法

    普通字符

    普通字符包括沒有顯示指定為元字符的所有可打印和不可打印字符。這包括所有大寫和小寫字母,所有數(shù)字,所有標(biāo)點(diǎn)符號和其他一些符號。

    非打印字符

    非打印字符也可以是正則表達(dá)式的組成部分。下面列出表示非打印字符的轉(zhuǎn)義序列:

    字符描述
    \cx匹配由x指明的控制字符。例如, \cM 匹配一個(gè) Control-M 或回車符。x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個(gè)原義的 'c' 字符。
    \f匹配一個(gè)換頁符。等價(jià)于\x0c 和\cL
    \n匹配一個(gè)換行符。等價(jià)于\x0a和\cJ
    \r匹配一個(gè)回車符。等價(jià)于\x0d和\cM
    \s匹配任何空白字符,包括空格、制表符、換頁符等等。等價(jià)于 [ \f\n\r\t\v]。注意 Unicode 正則表達(dá)式會(huì)匹配全角空格符。
    \S匹配任何非空白字符。等價(jià)于 [^ \f\n\r\t\v]。
    \t匹配一個(gè)制表符。等價(jià)于 \x09 和 \cI
    \v匹配一個(gè)垂直制表符。等價(jià)于 \x0b 和 \cK

    特殊字符

    所謂特殊字符,就是有一些特殊含義的字符,需要在試圖匹配它們時(shí)特別對待。若要匹配這些特殊字符,必須首先使字符“轉(zhuǎn)義”。

    特別字符描述
    $匹配輸入字符串的結(jié)尾位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性,則??字符本身,請使用 \$
    ()標(biāo)記一個(gè)子表達(dá)式的開始和結(jié)束位置。子表達(dá)式可以獲取供以后使用。要匹配這些字符,請使用?和和
    *匹配前面的子表達(dá)式零次或多次。要匹配 * 字符,請使用 \*
    +匹配前面的子表達(dá)式一次或多次。要匹配 + 字符,請使用 \+
    .匹配除換行符 \n 之外的任何單字符。要匹配 . ,請使用 \.
    [標(biāo)記一個(gè)中括號表達(dá)式的開始。要匹配 [,請使用 \[
    ?匹配前面的子表達(dá)式零次或一次,或指明一個(gè)非貪婪限定符。要匹配 ? 字符,請使用 \?
    \將下一個(gè)字符標(biāo)記為或特殊字符、或原義字符、或向后引用、或八進(jìn)制轉(zhuǎn)義符。例如, 'n' 匹配字符 'n'。'\n' 匹配換行符。序列 '\\' 匹配 "\",而 '\(' 則匹配 "("
    ^匹配輸入字符串的開始位置,除非在方括號表達(dá)式中使用,此時(shí)它表示不接受該字符集合。要匹配 ^ 字符本身,請使用 \^
    {標(biāo)記限定符表達(dá)式的開始。要匹配 {,請使用 \{
    |指明兩項(xiàng)之間的一個(gè)選擇。要匹配 |,請使用 \|

    限定符

    限定符用來指定正則表達(dá)式的一個(gè)給定組件必須要出現(xiàn)多少次才能滿足匹配。正則表達(dá)式的限定符有:

    字符描述
    *匹配前面的子表達(dá)式零次或多次。例如,ap* 能匹配 "a" 以及 "apple"。* 等價(jià)于{0,}
    +匹配前面的子表達(dá)式一次或多次。例如,'ap+' 能匹配 "ap" 以及 "apple",但不能匹配 "a"。+ 等價(jià)于 {1,}
    ?匹配前面的子表達(dá)式零次或一次。例如,"app(le)?" 可以匹配 "app" 、 "apple" 。? 等價(jià)于 {0,1}
    {n}n 是一個(gè)非負(fù)整數(shù)。匹配確定的 n 次。例如,'ap{2}不能匹配"ape",但能匹配"app"
    {n,}n 是一個(gè)非負(fù)整數(shù)。至少匹配n 次
    {n,m}m 和 n 均為非負(fù)整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次

    *,+限定符都是貪婪的,因?yàn)樗鼈儠?huì)盡可能多的匹配文字,只有在它們的后面加上一個(gè)?就可以實(shí)現(xiàn)非貪婪或最小匹配。

    定位符

    定位符能夠?qū)⒄齽t表達(dá)式固定到行首或者行尾,還能定位在一個(gè)單詞內(nèi)部或者開頭或者結(jié)尾。正則表達(dá)式的定位符有:

    字符描述
    ^匹配輸入字符串開始的位置
    $匹配輸入字符串結(jié)尾的位置
    \b匹配一個(gè)字邊界,即字與空格間的位置
    \B非字邊界匹配

    選擇

    用圓括號將所有選擇項(xiàng)括起來,相鄰的選擇項(xiàng)之間用|分隔。但用圓括號會(huì)有一個(gè)副作用,使相關(guān)的匹配會(huì)被緩存,此時(shí)可用?:放在第一個(gè)選項(xiàng)前來消除這種副作用。
    其中 ?: 是非捕獲元之一,還有兩個(gè)非捕獲元是 ?= 和 ?!,這兩個(gè)還有更多的含義,前者為正向預(yù)查,在任何開始匹配圓括號內(nèi)的正則表達(dá)式模式的位置來匹配搜索字符串,后者為負(fù)向預(yù)查,在任何開始不匹配該正則表達(dá)式模式的位置來匹配搜索字符串。

    反向引用

    對反向引用目前還未深入了解,之后如遇到實(shí)際使用,會(huì)再來補(bǔ)充。

    在Hive中的使用

    • regexp_extract
      語法:regexp_extract(string subject,string pattern,int index)
      返回值:string
      說明:將字符串subject按照pattern正則表達(dá)式的規(guī)則拆分,返回指定index的字符
    select regexp_extract('apple#orange#banana','([a-z]+)#([a-z]+)#([a-z]+)',2)
    • regexp_replace
      語法:regexp_replace(string a,string b,string c)
      返回值:string
      說明:將字符串a(chǎn)中的符合正則表達(dá)式b的部分替換成c

    hive中的正則表達(dá)式還是很強(qiáng)大的。數(shù)據(jù)工作者平時(shí)也離不開正則表達(dá)式。對此,特意做了個(gè)hive正則表達(dá)式的小結(jié)。所有代碼都經(jīng)過親測,正常運(yùn)行。

    1.regexp

    語法: A REGEXP B
    操作類型: strings
    描述: 功能與RLIKE相同

    select count(*) from olap_b_dw_hotelorder_f where create_date_wid not regexp '\\d{8}'

    與下面查詢的效果是等效的:

    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正則表達(dá)式的規(guī)則拆分,返回index指定的字符。

    hive> select regexp_extract('IloveYou','I(.*?)(You)',1) from test1 limit 1; Total jobs = 1 ... Total MapReduce CPU Time Spent: 7 seconds 340 msec OK love Time taken: 28.067 seconds, Fetched: 1 row(s) hive> select regexp_extract('IloveYou','I(.*?)(You)',2) from test1 limit 1; Total jobs = 1 ... OK You Time taken: 26.067 seconds, Fetched: 1 row(s) hive> select regexp_extract('IloveYou','(I)(.*?)(You)',1) from test1 limit 1; Total jobs = 1 ... OK I Time taken: 26.057 seconds, Fetched: 1 row(s) hive> select regexp_extract('IloveYou','(I)(.*?)(You)',0) from test1 limit 1; Total jobs = 1 ... OK IloveYou Time taken: 28.06 seconds, Fetched: 1 row(s) hive> select regexp_replace("IloveYou","You","") from test1 limit 1; Total jobs = 1 ... OK Ilove Time taken: 26.063 seconds, Fetched: 1 row(s)

    3.regexp_replace

    語法: regexp_replace(string A, string B, string C)
    返回值: string
    說明:將字符串A中的符合java正則表達(dá)式B的部分替換為C。注意,在有些情況下要使用轉(zhuǎn)義字符,類似oracle中的regexp_replace函數(shù)。

    hive> select regexp_replace("IloveYou","You","") from test1 limit 1; Total jobs = 1 ... OK Ilove Time taken: 26.063 seconds, Fetched: 1 row(s) hive> select regexp_replace("IloveYou","You","lili") from test1 limit 1; Total jobs = 1 ... OK Ilovelili

    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。