正則表達式學習(下)

學習資料:

4. 選擇蝉稳、分組嚣伐、向后引用

分組通過對文本加一對()圓括號來幫助執(zhí)行某種操作:

  • 在兩種或者更多的可選模式中選擇一個
  • 創(chuàng)建子模式
  • 捕獲一個分組以便之后進行后向引用
  • 對組合的模式使用某項操作负溪,如量詞
  • 使用非捕獲分組
  • 原子分組
  • 選擇操作
選擇操作

文本中含有thethence,部分也會高亮


4.1 子模式

一般,提到正則表達式中的子模式subpattern吹由,指的是分組中的一個或者多個分組。子模式就是模式中的模式

多數(shù)情況朱嘴,子模式中的條件能得到匹配的的前提是前面的模式得到了匹配倾鲫,但也有例外,例如:

  • 子模式不依賴前面的模式:

上面的(the|The|THE)萍嬉,有3個子模式: the, The, THE

這種情況下乌昔,第2個子模式并不需要依賴于是否匹配第1個,盡管 最左邊的模式會首先匹配


  • 子模式依賴前面的模式:
子模式依賴前面匹配

整體含義:匹配到t或者T后壤追,再匹配一個h磕道,接下來是e或者eir

能夠匹配到的4個單詞: thetheir行冰, The溺蕉, Their

第2個e|eir子模式,必須依賴于第1個t|T子模式

括號對于子模式不是必需的


  • 字符組子模式:
字符組子模式

兩個\b表示單詞邊界悼做,表明該模式只匹配一個完整的單詞疯特,而不再是單詞的一部分

  • [tT]:字符組,匹配t或者T肛走,可以看作是第一個子模式
  • h:嘗試匹配小寫字母h
  • [ceinry]:字符組漓雅,匹配組內(nèi)的字母,*表示零個或者多個

4.3 捕獲分組和后向引用

當一個模式的全部的或者部分內(nèi)容由一對括號分組時朽色,就對內(nèi)容進行捕獲并臨時存儲于內(nèi)存中

注意:引用的是捕獲的內(nèi)容故硅,形式為:

\1 
//或者
$1

\1或者$1引用的是第1個捕獲的分組,\2,$2引用的是第2個捕獲的分組纵搁,依次類推

簡單使用吃衅,重新排序一行:

后向引用,重新排序

首先分別捕獲目標分組腾誉,然后再Replace標簽下的輸入框中輸入$2 $1徘层,就可以看到高亮的文本峻呕,換了順序


4.4 非捕獲分組

非捕獲分組Non-Capturing Group,不會將其內(nèi)容存入內(nèi)存中趣效,由于不儲存內(nèi)容瘦癌,能提高性能,在恰當復雜場景下跷敬,更適合使用

一開始的(the|The|THE)讯私,可以改寫成非捕獲分組形式:

(?:the|The|THE)

  • 原子分組

原子分組atomic-group另一種非捕獲分組,可以將回溯操作關閉西傀,只針對原子分組內(nèi)的部分斤寇,而不針對整個正則表達式

正則表達式處理過程緩慢的一個因素就是回溯操作,原因在于回溯操作會嘗試每一種可能性拥褂,會比較耗時和耗資源娘锁。如果一個回溯操作產(chǎn)生巨大的負面效應,就被稱為 災難性回溯

原子分組饺鹃,回溯操作莫秆,百度了下,看了看悔详,暫時先不考慮了镊屎,先知道有這么個玩意。茄螃。缝驳。


5. 字符組

字符組,也被稱為 方括號表達式(backeted expression)责蝠,有助于匹配特定的字符或者特定的字符序列

匹配11到19間偶數(shù)

利用字符組,配11-20間的偶數(shù)萎庭,以及az

字符組內(nèi)也可以使用簡寫式,例如:

  • 匹配空格和單詞字符
[\w\s]
//等價于
[_a-zA-Z \t\n\r]

5.1 字符組取反

  • 字符組取反:

匹配與字符組內(nèi)容不匹配霜医,不符合條件的的字符

取反

字符組內(nèi)開始的脫字符^意義就是NO,我不想匹配這些字符驳规,^必須位于字符組的最開始位置


6 匹配Unicode和其他字符

ASCII(American Standard Code for Inforation Interchange)美國信息交換標準碼定義了英文字符集肴敛,AZ大寫和小字字母,以及控制字符吗购,其他字符医男,一共含有128

Unicode有10萬個字符,它將ASCII碼表加入了基本Basic Latin拉丁碼表

伏爾泰先生的話捻勉,大意:

  • 什么是寬容镀梭?它是人性的產(chǎn)物。我們生來都有缺陷和錯誤踱启,就讓我們原諒彼此的蠢行吧报账!這才是大自然的第一法則

6.1 匹配Unicode字符

匹配é字符

\u之后接的是十六進制的00e9研底,不需要區(qū)分大小寫。在Unicode表中透罢,é的代碼點為U+00E9榜晦,00e9對應十進制的233,超出了ASCII碼表0-127的范圍

除了使用十六進制外羽圃,還可以使用八進制來匹配字符乾胶,正則表達式的格式就是\后,接三位數(shù)字

\351
//等價于
朽寞、\u00e9

7. 量詞

  • 配合練習的app:Reggy

7.1 貪心识窿、懶惰和占有

指的是量詞的特性

  • 貪心

量詞自身是貪心的。貪心的量詞首先會匹配整個字符串愁憔。嘗試匹配時腕扶,會盡可能多的選定內(nèi)容,也就是整個輸入

量詞首次嘗試匹配整個字符串吨掌,如果失敗則回退一個字符后再次嘗試半抱,這個過程則稱為回溯backtracking。每次會回退一個字符后膜宋,直到找到的匹配內(nèi)容或者沒有字符可以嘗試為止窿侈。而整個過程都會被記錄,對資源的消耗最大

整個過程就是:先吃盡把整個字符串秋茫,然后每次再吐一點史简,慢慢咀嚼消化


  • 懶惰

懶惰是另外一種策略。從目標的起始位置開始嘗試尋找匹配肛著,每次檢查字符串的一個字符圆兵,尋找要匹配的內(nèi)容。最終枢贿,會嘗試匹配整個字符串殉农。要使一個量詞稱為懶惰的, 必需要普通的量詞后添加一個?局荚。意味著超凳,每次只吃一點


  • 占有

占有量詞會覆蓋整個目標然后嘗試尋找匹配的內(nèi)容,但只會嘗試一次耀态,并不會回溯轮傍。占有個量詞就是在普通的量詞前加一個+,意味著首装, 并不咀嚼而是直接吞咽创夜,然后才去想吃什么


7.2 用*、+和?進行匹配

  • Kleene星號

這一命名是為了紀念正則表達式的發(fā)明人Stephen Kleene

.*:將會以貪心的方式匹配仙逻,匹配任意字符零次或者多次挥下。

使用星號

Multiline模式下揍魂,9以及0兩行都會標亮,在這個模式下棚瘟,.號會匹配換行符现斋,而一般情況下,.號并不會匹配換行符


問號

*,+,?默認都是貪心的量詞偎蘸,第一次都會盡可能多地匹配字符

語法 描述
* 零個或者多個
+ 一個或者多個
? 零個或者一個

7.3 匹配特定次數(shù)

匹配數(shù)字8庄蹋,3次至5次
  • 6{1}:匹配一個6
  • 7{1,}:匹配多個7
  • 8{3,5}:匹配8888888迷雪,88888
7{1,} ---> 等價于: 7+
7*    ---> 等價于: 7{0,}
7?    ---> 等價于: 7{0,1}
語法 描述
{n} 精確匹配n次
n, 匹配n次或者更多次
m,n 匹配m次至n次
0,1 零次或1次限书,與?相同
1,0 1次或更多,與+相同
0, 零次或多次章咧,與*相同

7.4 懶惰量詞

懶惰量詞匹配

只匹配了兩個5倦西,而不像貪心型量詞那樣,匹配5個數(shù)字5

語法 描述
?? 懶惰匹配零次或一次赁严,可選
+? 懶惰匹配一次或者多次
*? 懶惰匹配零次或多次
{n}? 懶惰匹配n次
{n,}? 懶惰匹配n次或多次
{m,n}? 懶惰匹配m至n次

如果想要匹配最少而非最多數(shù)目的字符扰柠,可以使用懶惰量詞


7.5 占有式匹配

占有式匹配很像貪心式匹配,會選定盡可能多的內(nèi)容疼约,但與貪心式不同的是卤档,不會進行回溯,所以速度也就最快程剥。占有式量詞并不會放棄找到的內(nèi)容劝枣,匹配到內(nèi)容后就會占有,這也是為啥稱為占有式的原因

占有式织鲸,以0開頭

當將表達式修改為.*+0時舔腾,卻沒有匹配到任何字符,最后一行0并沒有被高亮

原因就是沒有回溯搂擦,首先一下子選定了所有了輸入稳诚,不再回過來查看。它會一下子揮霍了自己的財產(chǎn)盾饮,一下子沒在結(jié)尾找到0采桃,也不知道再從哪里開始找起

當知道文本內(nèi)容時懒熙,知道在哪里可以找到匹配丘损,應該考慮使用占有式量詞

語法 描述
?+ 占有式匹配零次或者一次,可選
++ 占有式匹配一次或多次
*+ 占有式匹配零次或多次
{n}+ 占有式匹配n次
{n,}+ 占有式匹配n次或更多次
{m,n}+ 占有式匹配m至n次

8. 簡單實例

  • 匹配北美電話號碼


    匹配電話號碼

^\(?(?:\d{3})\)?[-.]?(?:\d{3})[-.]?(?:\d{4})$:

  1. ^:判定一行開始或者主題詞開始開頭的零寬度斷言
  2. \(?:判定(工扎,可選
  3. ?:\d{3}:匹配連續(xù)三位數(shù)字的非捕獲分組
  4. \)?:判定)徘钥,可選
  5. [-.]?:允許有可選的連字符-或者.
  6. ?:\d{3}:匹配連續(xù)三位數(shù)字的非捕獲分組
  7. [-.]?:允許有可選的連字符-或者.
  8. ?:\d{4}:匹配連續(xù)四位數(shù)字的非捕獲分組
  9. $:匹配一行或者主題詞的結(jié)尾

自己想到的一個改進,可能不合理:^\(?((?:\d{3})\)?[-.]?){2}?(?:\d{4})$


  • 匹配郵箱
匹配郵箱

表達式 (?:[\w.-_]+)?(?:\w+)@(?:[\w._])+(?:\w+){1,}Regexr Community 中的Email Address得到肢娘,網(wǎng)站給的是JavaScript下適用的呈础,自己嘗試做了一點點修改舆驶,瞎改的,不要試圖拿來直接在自己的代碼中用而钞。沙廉。。


元字符

偷個懶臼节,直接截圖


9. 最后

書看是看完了撬陵,然而感覺啥都沒記住,需要多多練習网缝。書后面3章看了看巨税,沒做啥記錄

本人很菜,有錯誤粉臊,請指出

共勉 :)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末草添,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扼仲,更是在濱河造成了極大的恐慌远寸,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犀盟,死亡現(xiàn)場離奇詭異而晒,居然都是意外死亡,警方通過查閱死者的電腦和手機阅畴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門倡怎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贱枣,你說我怎么就攤上這事监署。” “怎么了纽哥?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵钠乏,是天一觀的道長。 經(jīng)常有香客問我春塌,道長晓避,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任只壳,我火速辦了婚禮俏拱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吼句。我一直安慰自己锅必,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布惕艳。 她就那樣靜靜地躺著搞隐,像睡著了一般驹愚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上劣纲,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天逢捺,我揣著相機與錄音,去河邊找鬼癞季。 笑死蒸甜,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的余佛。 我是一名探鬼主播柠新,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辉巡!你這毒婦竟也來了恨憎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤郊楣,失蹤者是張志新(化名)和其女友劉穎憔恳,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體净蚤,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡钥组,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了今瀑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片程梦。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖橘荠,靈堂內(nèi)的尸體忽然破棺而出屿附,到底是詐尸還是另有隱情,我是刑警寧澤哥童,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布挺份,位于F島的核電站,受9級特大地震影響贮懈,放射性物質(zhì)發(fā)生泄漏匀泊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一朵你、第九天 我趴在偏房一處隱蔽的房頂上張望各聘。 院中可真熱鬧,春花似錦撬呢、人聲如沸伦吠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毛仪。三九已至,卻和暖如春芯勘,著一層夾襖步出監(jiān)牢的瞬間箱靴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工荷愕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留衡怀,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓安疗,卻偏偏與公主長得像抛杨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子荐类,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容