正則表達式匹配次數

正則表達式裏匹配次數的元字符有: 
(一) {0,1}{0,}{1,}{3} 逗號前面次數到逗號後面次數 
(二) ??? 0次或1次 
(三) * 0次以上,即0~n 
(四) + 1次以上,即1~n正則表達式

下面深刻講解下這幾個元字符的意義: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? 用於匹配httphttps 
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

相關文章
相關標籤/搜索