1.子表示式
子表示式通常作為更長的表示式的一部分,子表示式可以作為單一的實體來使用。 子表示式由()來定義。前文說過,表示重複次數的元字元只能作用於緊挨著它的前乙個字元,引入子表示式之後,就可以讓子表示式作為乙個整體重複多次。python和hive中都有語法幫助我們提取出子表示式匹配的內容。
python版本:
import re
result=re.search(r'(\d)-(\d)','0571-68819999')
print(result.groups())
實驗結果:
('0571', '68819999')
hive版本:
select '0' as num, regexp_extract('0571-68819999','^(\\d)-(\\d)$',0) as result
union
select '1' as num, regexp_extract('0571-68819999','^(\\d)-(\\d)$',1) as result
union
select '2' as num, regexp_extract('0571-68819999','^(\\d)-(\\d)$',2) as result
**結果如下:(從實驗結果可以看出,hive中分組的索引是從1開始的,0對應的是完整匹配)
numresult
00571-68819999
10571
268819999
子表示式是支援巢狀的,但是巢狀之後各個表示式的索引會容易引起混亂。
python版本:
import re
str_1='135-0577-2345'
match=re.search(r'(((\d)-(\d))-(\d))',str_1)
print(match.groups())
**結果:
('135-0577-2345', '135-0577', '135', '0577', '2345')
從結果和其對應的索引關係可以看出,索引編號是從外到內,從左到右,深度優先。
hive版本:
select '1' as num, regexp_extract('135-0577-2345','(((\\d)-(\\d))-(\\d))',1) as result
union
select '2' as num, regexp_extract('135-0577-2345','(((\\d)-(\\d))-(\\d))',2) as result
union
select '3' as num, regexp_extract('135-0577-2345','(((\\d)-(\\d))-(\\d))',3) as result
union
select '4' as num, regexp_extract('135-0577-2345','(((\\d)-(\\d))-(\\d))',4) as result
union
select '5' as num, regexp_extract('135-0577-2345','(((\\d)-(\\d))-(\\d))',5) as result
**結果如下:(hive中的索引和python中的索引順序一致)
numresult
1135-0577-2345
2135-0577
3135
40577
52345
2. 反向引用
反向引用允許正規表示式模式引用之前匹配的結果。反向引用需要結合字表示式一起使用。這個主要用來匹配需要成對出現的模式。以乙個python程式為例(**中的\1表示引用分組索引為1的匹配結果):
import re
str_1=''
str_2='
null
hive和mysql中也支援反向引用。注意,我用的mysql8.0版本,在其他書上看到mysql5版本可能是不支援反向引用的。
select '1' as num, '' regexp '<(h[1-6])>\\w+' as result
union
select '2' as num, 'hello123world' regexp '<(h[1-6])>\\w+' as result
hive執行結果如下:
numresult
1true
2false
3. mysql8.0中支援的正規表示式函式
namedescription
regexp
字串中是否有與模式匹配的子串,如果有返回1或true,沒有返回0或false。
not regexp
將 regexp表達的結果置反。
regexp_like
與regexp結果相同。
rlike
與regexp結果相同。
regexp_instr
返回字串中與模式匹配的子串的開始索引位置,若沒有子串與模式匹配,則返回0。
regexp_replace
將字串中與模式匹配的子串替換成其他字串。
regexp_substr
返回字串中與模式匹配的子串。
regexp_like**(mysql中字串索引從1開始):
select '1' as num,regexp_instr('hello123world456','[0-9]+') as result
union all
-- 引數7用來指定開始搜尋的位置,不寫預設為1
select '2' as num,regexp_instr('hello123world456','[0-9]+',7) as result
union all
-- 引數2的作用:當字串中有多個子串與模式匹配是時,定位到第2個與模式匹配的子串,返回該子串的起始索引
select '3' as num,regexp_instr('hello123world456','[0-9]+',1,2)as result
union all
select '4' as num,regexp_instr('hello123world456hello123','[0-9]+',1,3)as result
結果如下:
numresult16
27314
422regexp_replace\substr()**:
select '1' as num,regexp_replace('hello123world','[0-9]+',' ') as result
union all
select '2' as num,regexp_substr('hello123world','[0-9]+') as result
結果如下:
numresult
1hello world
2123
正規表示式(1):
轉義字元:
表示式反向解析 正規表示式 反向引用
分組不僅用在匹配結果中,也可以在匹配的正規表示式中使用分組匹配的結果,這種功能稱為反向引用 backreference 當待匹配的字串中有些子字串出現多次的話,正規表示式模式可以將第乙個出現的子字串儲存在分組中,在模式的後面可以直接引用第乙個匹配的結果。因為分組即可通過索引也可以通過名字來訪問,所以...
正規表示式反向引用
微軟關於正規表示式的反向引用的官方文件 1 第1個 代表任意字元,後面的 代表 前面的任意字元有0個或多個 第2個 也代表任意字元,但它被括號括起來了,括號代表它 獲了,相當於被複製了,還沒被貼上 第3個 也代表任意字元,後面的 代表 前面的任意字元有0個或多個 第1個 代表轉譯符,這個符號不能直接...
正規表示式的反向引用
其實,小括號包含的表示式所匹配到的字串 不僅是在匹配結束後才可以使用,在匹配過程中也可以使用。表示式後邊的部分,可以引用前面 括號內的子匹配已經匹配到的字串 引用方法是 加上乙個數字。1 引用第1對括號內匹配到的字串,2 引用第2對括號內匹配到的字串 以此類推,如果一對括號內包含另一對括號,則外層的...