下面深刻講解下這幾個元字符的意義:ide
(一) {0,1}
、{0,}
、{1,}
、{3}
逗號前面次數到逗號後面次數
上面列了幾種都是{}
用於表示次數時常見的寫法。
1. {0,1}
匹配0次或1次
2. {0,}
匹配0次以上,逗號後面爲空表示無限次的意思
3. {1,}
匹配1次以上
4. {3}
匹配3次,它是{3,3}
的簡寫形式code
須要注意的是,前面數字大於後面數字是會報錯的regexp
有時候會看到[0-9]{1}
這樣的寫法,其實這樣寫也算是多餘的,它等價[0-9]
,正則裏沒有添加量詞修飾的匹配都是按1次算。rpc
(二) ?
、??
0次或1次
?
匹配0次或1次,能夠理解爲{0,1}
的簡寫,常見用法有:
1. https?
用於匹配http
或https
2. (https?://)?
用於匹配域名前綴https?://
無關緊要的狀況。
另外,須要瞭解的是,?
是匹配優先的,這是什麼意思呢?
所謂匹配優先,就是字面意思,能匹配我就先匹配。
下面舉例說明一下:
源碼:www.zjmainstay.cn
正則:^(www\.)?(.+)$
匹配結果是:分組1獲得了www.
,分組2獲得了zjmainstay.cn
從這裏能夠看出,對於(www\.)?
部分的正則,它先進行了匹配,而後.+
部分再匹配。
那麼,若是咱們想要把www.
留給後面的.+
去匹配怎麼辦?
咱們須要找到一個非匹配優先的方法,對於非匹配優先,接觸過非貪婪模式的讀者可能立刻想到非貪婪模式,不錯,利用非貪婪模式能夠解決這個問題:
正則:^(www\.)*?(.+)$
固然,使用正則:^(www\.){0,1}?(.+)$
也是能夠的,並且這個更接近本來的意思。
另外,不少人可能沒見過,其實咱們還能用:^(www\.)??(.+)$
實現。這裏的??
是?
的非匹配優先版本。get
(三) *
0次以上,即0~n
*
0次或任意次,能夠理解爲{0,}
的簡寫,常見用法有:
1. .*
貪婪模式,匹配優先,匹配除換行外的任意字符0次以上
2. .*?
非貪婪模式,非匹配優先,匹配除換行外的任意字符0次以上
3. <a href="/[^"]*"
在href="/"
的雙引號中間,匹配非"
的字符0次以上源碼
你們可能發現,.*?
這裏也有?
,可是它已經脫離了前面對?
介紹的0次或1次的範圍,沒錯,只是爲了讓你們不至於混淆,我沒有把它納入上面的?
當中。
咱們能夠理解爲,?
只要跟本文所說的幾個計次量詞結合,就造成非貪婪模式。甚至,連??
你均可以認爲是結合後的0次或1次的非貪婪模式,反正也能解釋通不是?qt
(四) +
1次以上,即1~n
+
與 *
除了匹配次數意義上有所差異,常見用法都相似,它強調的是至少匹配1次以上,能夠理解爲{1,}
的簡寫。
1. .+
貪婪模式,匹配優先,匹配除換行外的任意字符1次以上
2. .+?
非貪婪模式,非匹配優先,匹配除換行外的任意字符1次以上
3. <a href="/[^"]+"
在href="/"
的雙引號中間,匹配非"
的字符1次以上域名
總結
量詞自己使用時,都是貪婪模式匹配,而量詞和?
能結合成非貪婪模式匹配。
貪婪模式匹配就是儘量多地匹配,非貪婪模式匹配就是儘量少地匹配。it