亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Regex > 正文

正則表達式學習參考 正則入門學習資料

2020-03-16 21:09:02
字體:
來源:轉載
供稿:網友
正則表達式(Regular Expression)是一種匹配模式,描述的是一串文本的特征
 
 
 
1 概述 
正則表達式(Regular Expression)是一種匹配模式,描述的是一串文本的特征。 

正如自然語言中“高大”、“堅固”等詞語抽象出來描述事物特征一樣,正則表達式就是字符的高度抽象,用來描述字符串的特征。 

正則表達式(以下簡稱正則,Regex)通常不獨立存在,各種編程語言和工具作為宿主語言提供對正則的支持,并根據自身語言的特點,進行一定的剪裁或擴展。 

正則入門很容易,有限的語法規則很容易掌握,但是目前正則的普及率并不高,主要是因為正則的流派眾多,各種宿主語言提供的文檔都過多的關注于自身的一些細節,而這些細節通常是初學者并不需要關注的。 

當然,如果想要深入的了解正則表達式,這些細節又是必須被關注的,這是后話,讓我們先從正則的基礎開始,進入正則表達式的世界。 

2 正則表達式基礎 
2.1 基本概念 
2.1.1 字符串組成
正則表達式學習參考 正則入門學習資料
對于字符串“a5”,是由兩個字符“a”、“5”以及三個位置組成的,這一點對于正則表達式的匹配原理理解很重要。

2.1.2  占有字符和零寬度

正則表達式匹配過程中,如果子表達式匹配到的是字符內容,而非位置,并被保存到最終的匹配結果中,那么就認為這個子表達式是占有字符的;如果子表達式匹配的僅僅是位置,或者匹配的內容并不保存到最終的匹配結果中,那么就認為這個子表達式是零寬度的。
占有字符還是零寬度,是針對匹配的內容是否保存到最終的匹配結果中而言的。
占有字符是互斥的,零寬度是非互斥的。也就是一個字符,同一時間只能由一個子表達式匹配,而一個位置,卻可以同時由多個零寬度的子表達式匹配。

2.1.3  正則表達式構成

正則表達式由兩種字符構成。一種是在正則表達式中具體特殊意義的“元字符”,另一種是普通的“文本字符”。
元字符可以是一個字符,如“^”,也可以是一個字符序列,如“/w”。

2.2     元字符(Meta Character)

2.2.1  […] 字符組(Character Classes)

字符組可以匹配[ ]中包含的任意一個字符。雖然可以是任意一個,但只能是一個。
字符組支持由連字符“-”來表示一個范圍。當“-”前后構成范圍時,要求前面字符的碼位小于后面字符的碼位。
[^…] 排除型字符組。排除型字符組表示任意一個未列出的字符,同樣只能是一個。排除型字符組同樣支持由連字符“-”來表示一個范圍。

表達式 說明
[abc] 表示“a”或“b”或“c”
[0-9] 表示0~9中任意一個數字,等價于[0123456789]
[/u4e00-/u9fa5] 表示任意一個漢字
[^a1<] 表示除“a”、“1”、“<”外的其它任意一個字符
[^a-z] 表示除小寫字母外的任意一個字符

舉例:
[0-9][0-9]”在匹配“Windows 2003”時,匹配成功,匹配的結果為“20”。
[^inW]”在匹配“Windows 2003”時,匹配成功,匹配的結果為“d”。

2.2.2  常見字符范圍縮寫

對于一些常用的字符范圍,如數字等,由于非常常用,即使使用[0-9]這樣的字符組仍顯得麻煩,所以定義了一些元字符,來表示常見的字符范圍。

表達式 說明
/d 任意一個數字,相當于[0-9],即0~9 中的任意一個
/w 任意一個字母或數字或下劃線,相當于[a-zA-Z0-9_]
/s 任意空白字符,相當于[ /r/n/f/t/v]
/D 任意一個非數字字符,/d取反,相當于[^0-9]
/W /w取反,相當于[^a-zA-Z0-9_]
/S 任意非空白字符,/s取反,相當于[^ /r/n/f/t/v]

舉例:
/w/s/d”在匹配“Windows 2003”時,匹配成功,匹配的結果為“s 2”。

2.2.3  . 小數點

小數點可以匹配除“/n”以外的任意一個字符。如果要匹配包括“/n”在內的所有字符,一般用[/s/S],或者是用“.”加(?s)匹配模式來實現。

表達式 說明
. 匹配除了換行符 /n 以外的任意一個字符

2.2.4  其它元字符


表達式 說明
^ 匹配字符串開始的位置,不匹配任何字符
$ 匹配字符串結束的位置,不匹配任何字符
/b 匹配單詞邊界,不匹配任何字符

舉例:
^a”在匹配“cba”時,匹配失敗,因為表達式要求開始位置后面是字符“a”,而“cba”顯然是不滿足的。
/d$”在匹配“123”時,匹配成功,匹配結果為“3”,這個表達式要求匹配結尾處的數字,如果結尾處不是數字,如“123abc”,則是匹配失敗的。

2.2.5  轉義字符

一些不可見字符,或是在正則中具有特殊意義的元字符,如想匹配字符本身,需要用“/”對其進行轉義。
 

表達式 說明
/r,/n 回車和換行
// 匹配“/”本身
/^,/$,/. 分別匹配“^”、“$”和“.”

以下字符在匹配其本身時,通常需要進行轉義。在實際應用中,根據具體情況,需要轉義的字符可能不止如下所列字符
 .  $  ^  {  [  (  |  )  *  +  ?  /

2.2.6  量詞(Quantifier)

量詞表示一個子表達式可以匹配的次數。量詞可以用來修飾一個字符、字符組,或是用()括起來的子表達式。一些常用的量詞被定義成獨立的元字符。

表達式 說明 舉例
{m} 表達式匹配m次 “/d{3}”相當于“/d/d/d ”
“(abc){2}”相當于“abcabc”
{m,n} 表達式匹配最少m次,最多n次 “/d{2,3}”可以匹配“12”或“321”等2到3位的數字
{m,} 表達式至少匹配m次 “[a-z]{8,}”表示至少8位以上的字母
? 表達式匹配0次或1次,相當于{0,1} “ab?”可以匹配“a”或“ab”
* 表達式匹配0次或任意多次,相當于{0,} “<[^>]*>”中“[^>]*”表示0個或任意多個不是“>”的字符
+ 表達式匹配1次或意多次,至少1次,相當于{1,} “/d/s+/d”表示兩個數字中間,至少有一個以上的空白字符

注意:在不是動態生成的正則表達式中,不要出現“{1}”這樣的量詞,如“/w{1}”在結果上等價于“/w”,但是會降低匹配效率和可讀性,屬于畫蛇添足的做法。

2.2.7  分支結構(Alternation)

當一個字符串的某一子串具有多種可能時,采用分支結構來匹配,“|”表示多個子表達式之間“或”的關系,“|”是以()限定范圍的,如果在“|”的左右兩側沒有()來限定范圍,那么它的作用范圍即為“|”左右兩側整體。

表達式 說明
| 多個子表達式之間取“或”的關系

舉例:
^aa|b$”在匹配“cccb”時,是可以匹配成功的,匹配的結果是“b”,因為這個表達式表示匹配“^aa”或“b$”,而“b$”在匹配“cccb ”時是可以匹配成功的。
^(aa|b)$”在區配“cccb”時,是匹配失敗的,因為這個表達式表示在“開始”和“結束”位置之間只能是“aa”或“b”,而“cccb”顯然是不滿足的。

3       正則表達式進階

3.1     捕獲組(Capture Group)

捕獲組就是把正則表達式中子表達式匹配的內容,保存到內存中以數字編號或手動命名的組里,以供后面引用。

表達式 說明
(Expression) 普通捕獲組,將子表達式Expression匹配的內容保存到以數字編號的組里
(?<name> Expression) 命名捕獲組,將子表達式Expression匹配的內容保存到以name命名的組里

普通捕獲組(在不產生歧義的情況下,簡稱捕獲組)是以數字進行編號的,編號規則是以“(”從左到右出現的順序,從1開始進行編號。通常情況下,編號為0的組表示整個表達式匹配的內容。
命名捕獲組可以通過捕獲組名,而不是序號對捕獲內容進行引用,提供了更便捷的引用方式,不用關注捕獲組的序號,也不用擔心表達式部分變更會導致引用錯誤的捕獲組。

3.2     非捕獲組

一些表達式中,不得不使用( ),但又不需要保存( )中子表達式匹配的內容,這時可以用非捕獲組來抵消使用( )帶來的副作用。

表達式 說明
(?:Expression) 進行子表達式Expression的匹配,并將匹配內容保存到最終的整個表達式的區配結果中,但Expression匹配的內容不單獨保存到一個組內

3.3     反向引用

捕獲組匹配的內容,可以在正則表達式的外部程序中進行引用,也可以在表達式中進行引用,表達式中引用的方式就是反向引用。
反向引用通常用來查找重復的子串,或是限定某一子串成對出現。

表達式 說明
/1,/2 對序號為1和2的捕獲組的反向引用
/k<name> 對命名為name的捕獲組的反向引用

舉例:
(a|b)/1”在匹配“abaa”時,匹配成功,匹配到的結果是“aa”。“(a|b)”在嘗試匹配時,雖然既可以匹配“a”,也可以匹配“b”,但是在進行反向引用時,對應()中匹配的內容已經是固定的了。

3.4     環視(Look Around)

環視只進行子表達式的匹配,匹配內容不計入最終的匹配結果,是零寬度的。
環視按照方向劃分有順序和逆序兩種,按照是否匹配有肯定和否定兩種,組合起來就有四種環視。環視相當于對所在位置加了一個附加條件。
 

表達式 說明
(?<=Expression) 逆序肯定環視,表示所在位置左側能夠匹配Expression
(?<!Expression) 逆序否定環視,表示所在位置左側不能匹配Expression
(?=Expression) 順序肯定環視,表示所在位置右側能夠匹配Expression
(?!Expression) 順序否定環視,表示所在位置右側不能匹配Expression

舉例:
(?<=Windows )/d+”在匹配“Windows 2003”時,匹配成功,匹配結果為“2003”。我們知道“/d+”表示匹配一個以上的數字,而“(?<=Windows )”相當于一個附加條件,表示所在位置左側必須為“Windows ”,它所匹配的內容并不計入匹配結果。同樣的正則在匹配“Office 2003”時,匹配失敗,因為這里任意一串數字子串的左側都不是“Windows ”。
(?!1)/d+”在匹配“123”時,匹配成功,匹配的結果為“23”。“/d+”匹配一個以上數字,但是附加條件“(?!1)”要求所在位置右側不能是“1”,所以匹配成功的位置是“2”前面的位置。

3.5     忽略優先和匹配優先

或者叫做正則表達式匹配的貪婪與非貪婪模式。
標準量詞修飾的子表達式,在可匹配可不匹配的情況下,總會先嘗試進行匹配,稱這種方式為匹配優先,或者貪婪模式。此前介紹的一些量詞,“{m}”、“{m,n}”、“{m,}”、“?”、“*”和“+”都是匹配優先的。
一些NFA正則引擎支持忽略優先量詞,也就是在標準量詞后加一個“?”,此時,在可匹配可不匹配的情況下,總會先忽略匹配,只有在由忽略優先量詞修飾的子表達式,必須進行匹配才能使整個表達式匹配成功時,才會進行匹配,稱這種方式為忽略優先,或者非貪婪模式。忽略優先量詞包括“{m}?”、“{m,n}?”、“{m,}?”、“??”、“*?”和“+?”。
舉例:
源字符串:<div>aaa</div><div>bbb</div>
正則表達式1:<div>.*</div>      匹配結果:<div>aaa</div><div>bbb</div>
正則表達式2:<div>.*?</div>     匹配結果:<div>aaa</div>

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区日韩| 国产精品国产三级国产aⅴ9色| 亚洲欧洲高清在线| 亚洲欧美在线x视频| 久久99热精品| 一区二区三区精品99久久| 日韩精品高清在线| 欧美大片大片在线播放| 国产日韩欧美视频在线| 久久精品国产亚洲| 日韩在线免费av| 97视频免费在线观看| 狠狠色狠狠色综合日日五| 欧美激情综合色| 在线播放国产一区二区三区| 91成人精品网站| 91久热免费在线视频| 亚洲国产精品成人一区二区| 久久精品国产久精国产思思| 久久国产精品久久国产精品| 亚洲精品电影网在线观看| 欧美性猛交xxxx免费看| 日韩中文字幕在线| 国内精品小视频| 国产精品久久一| 日韩专区在线播放| 国产在线拍偷自揄拍精品| 国产成人福利夜色影视| 欧美丝袜美女中出在线| 国产精品视频26uuu| 日韩三级成人av网| 日韩欧美在线一区| 国产精品亚洲综合天堂夜夜| 亚洲在线一区二区| 国产精品第一第二| 国产欧美精品xxxx另类| 久热爱精品视频线路一| 少妇精69xxtheporn| 成人天堂噜噜噜| 久久视频在线免费观看| 狠狠躁18三区二区一区| 亚洲精品欧美日韩专区| 中文字幕亚洲无线码a| 国产精品极品在线| 欧美国产日韩免费| 性欧美长视频免费观看不卡| 国产精品91在线| 成人高清视频观看www| 黑人精品xxx一区| 国产91网红主播在线观看| 另类美女黄大片| 中文字幕日本欧美| 亚洲成人精品视频| 久久久综合免费视频| 国产亚洲精品综合一区91| 亚洲精品欧美日韩专区| 色综合导航网站| 国产精品色视频| 成人久久久久爱| 亚洲欧美制服第一页| 亚洲国产精品va在线| 中文字幕少妇一区二区三区| 国产精品99蜜臀久久不卡二区| 日韩视频―中文字幕| 亚洲天堂免费观看| 中日韩美女免费视频网址在线观看| 精品视频在线播放| 狠狠综合久久av一区二区小说| 在线视频免费一区二区| 亚洲人成欧美中文字幕| 日av在线播放中文不卡| 亚洲国产精品网站| 日韩中文字幕在线看| 精品国偷自产在线| 日韩在线视频网站| 岛国av一区二区在线在线观看| 精品国内自产拍在线观看| 欧美xxxx做受欧美.88| 亚洲最大福利网| 亚洲风情亚aⅴ在线发布| 亚洲第一中文字幕| 日韩精品免费在线视频观看| 欧美特黄级在线| 国产精品永久免费观看| 欧美激情精品久久久| 日本精品视频在线观看| 欧美日韩一区二区三区| 欧美成人精品不卡视频在线观看| 久久免费精品日本久久中文字幕| 欧亚精品在线观看| 2019国产精品自在线拍国产不卡| 国产午夜精品久久久| 91精品中文在线| 欧美裸体xxxx极品少妇软件| 国产精品爱久久久久久久| 日韩网站在线观看| 国产精品扒开腿做爽爽爽男男| 久久久亚洲福利精品午夜| 欧美高清视频在线播放| 日韩在线观看av| 亚洲精品资源在线| 亚洲国产小视频在线观看| 伊人久久久久久久久久| 日韩电影中文字幕一区| 91久久精品美女高潮| 欧美一级在线播放| 日韩成人av网址| 国模gogo一区二区大胆私拍| 性日韩欧美在线视频| 国产成人精彩在线视频九色| 中文字幕日韩av| 亚洲视频电影图片偷拍一区| 福利二区91精品bt7086| 亚洲xxxx妇黄裸体| 成人久久久久久久| 国产精品欧美日韩一区二区| 一本色道久久88精品综合| 一区二区三区日韩在线| 国产精品美女主播| 色综合久久久久久中文网| 国产精选久久久久久| 精品国产欧美一区二区三区成人| 欧美三级免费观看| 97在线视频精品| 久久99久国产精品黄毛片入口| 亚洲第一网中文字幕| 国产精品视频成人| 国产ts一区二区| 成人在线视频网站| 国产香蕉精品视频一区二区三区| 久久精品国产亚洲精品2020| 亚洲最大成人网色| 午夜精品久久久久久久99热| 亚洲专区国产精品| 不卡伊人av在线播放| 亚洲欧美国产精品专区久久| 欧美最猛性xxxxx(亚洲精品)| 色综合久久精品亚洲国产| 91精品国产自产在线| 精品久久久中文| 日韩欧美综合在线视频| 国产精品久久久999| 亚洲欧美国产精品专区久久| 久久亚洲一区二区三区四区五区高| 69av在线播放| 中文字幕在线视频日韩| 亚洲男女自偷自拍图片另类| 日本亚洲欧洲色α| 亚洲精品xxxx| 国产一区二区美女视频| 亚洲v日韩v综合v精品v| 亚洲第一偷拍网| 久99九色视频在线观看| 久久手机免费视频| 欧美贵妇videos办公室| 激情av一区二区| 777777777亚洲妇女| 日韩在线视频二区| 91免费视频国产| 欧美网站在线观看| 精品国产成人av| 性色av一区二区三区红粉影视| 亚洲精品在线看| 国产亚洲欧洲在线|