學習資料:
4. 選擇蝉稳、分組嚣伐、向后引用
分組通過對文本加一對()
圓括號來幫助執(zhí)行某種操作:
- 在兩種或者更多的可選模式中選擇一個
- 創(chuàng)建子模式
- 捕獲一個分組以便之后進行后向引用
- 對組合的模式使用某項操作负溪,如量詞
- 使用非捕獲分組
- 原子分組
- 選擇操作
文本中含有the
的thence
,部分也會高亮
4.1 子模式
一般,提到正則表達式中的子模式subpattern
吹由,指的是分組中的一個或者多個分組。子模式就是模式中的模式
多數(shù)情況朱嘴,子模式中的條件能得到匹配的的前提是前面的模式得到了匹配倾鲫,但也有例外,例如:
- 子模式不依賴前面的模式:
上面的(the|The|THE)
萍嬉,有3個子模式: the
, The
, THE
這種情況下乌昔,第2個子模式并不需要依賴于是否匹配第1個,盡管 最左邊的模式會首先匹配
- 子模式依賴前面的模式:
整體含義:匹配到t
或者T
后壤追,再匹配一個h
磕道,接下來是e
或者eir
能夠匹配到的4個單詞: the, their行冰, 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-20
間的偶數(shù)萎庭,以及a
到z
字符組內(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)美國信息交換標準碼
定義了英文字符集肴敛,A
到Z
大寫和小字字母,以及控制字符吗购,其他字符医男,一共含有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ù)
-
6{1}
:匹配一個6 -
7{1,}
:匹配多個7 -
8{3,5}
:匹配888
,8888
迷雪,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
并沒有被高亮
原因就是沒有回溯搂擦,首先一下子選定了所有了輸入稳诚,不再回過來查看。它會一下子揮霍了自己的財產(chǎn)盾饮,一下子沒在結(jié)尾找到0采桃,也不知道再從哪里開始找起
當知道文本內(nèi)容時懒熙,知道在哪里可以找到匹配丘损,應該考慮使用占有式量詞
語法 | 描述 |
---|---|
?+ |
占有式匹配零次或者一次,可選 |
++ |
占有式匹配一次或多次 |
*+ |
占有式匹配零次或多次 |
{n}+ |
占有式匹配n次 |
{n,}+ |
占有式匹配n次或更多次 |
{m,n}+ |
占有式匹配m至n次 |
8. 簡單實例
-
匹配北美電話號碼
匹配電話號碼
^\(?(?:\d{3})\)?[-.]?(?:\d{3})[-.]?(?:\d{4})$
:
-
^
:判定一行開始或者主題詞開始開頭的零寬度斷言 -
\(?
:判定(
工扎,可選 -
?:\d{3}
:匹配連續(xù)三位數(shù)字的非捕獲分組 -
\)?
:判定)
徘钥,可選 -
[-.]?
:允許有可選的連字符-
或者.
-
?:\d{3}
:匹配連續(xù)三位數(shù)字的非捕獲分組 -
[-.]?
:允許有可選的連字符-
或者.
-
?:\d{4}
:匹配連續(xù)四位數(shù)字的非捕獲分組 -
$
:匹配一行或者主題詞的結(jié)尾
自己想到的一個改進,可能不合理:^\(?((?:\d{3})\)?[-.]?){2}?(?:\d{4})$
- 匹配郵箱
表達式 (?:[\w.-_]+)?(?:\w+)@(?:[\w._])+(?:\w+){1,}
從Regexr Community 中的Email Address得到肢娘,網(wǎng)站給的是JavaScript
下適用的呈础,自己嘗試做了一點點修改舆驶,瞎改的,不要試圖拿來直接在自己的代碼中用而钞。沙廉。。
偷個懶臼节,直接截圖
9. 最后
書看是看完了撬陵,然而感覺啥都沒記住,需要多多練習网缝。書后面3章看了看巨税,沒做啥記錄
本人很菜,有錯誤粉臊,請指出
共勉 :)