摘要:對(duì)于含有量詞正則表達(dá)式,量詞是貪婪模式,會(huì)優(yōu)先選擇盡可能多的匹配修飾的字符,所以該表達(dá)式會(huì)優(yōu)先選擇匹配一個(gè)字符,當(dāng)匹配不到時(shí)再選擇不匹配字符。
正則表達(dá)式的語法 普通字符
字母、數(shù)字、漢字、下劃線以及一些沒有特殊定義的標(biāo)點(diǎn)符號(hào),都屬于普通字符,正則表達(dá)式中的普通字符匹配字符本身,如:
var str = "abced" console.log(str.match(/a/)) // ["a",index:0,input:"abced"][]字符
[]可以包含一系列字符,能夠匹配其中的任意一個(gè)字符,如[abc]匹配abc中的任意一個(gè)字符,使用[^abc]包含的字符能夠匹配除了abc以外的任何一個(gè)字符。比如以下含義:
[abc]:匹配abc中的任意一個(gè)字符
[^abc]:匹配出了abc的任意一個(gè)字符
[0-9]:匹配0-9中的任意一個(gè)數(shù)字
var str = "abcde" console.log(str.match(/[bcd][bcd]/)) // ["bc",index:1,input:"abcde"]元字符
.:匹配除換行符意外的任意一個(gè)字符
w:匹配任意一個(gè)字母或數(shù)組或下劃線,[A-Za-z0-9_]
W:匹配除w以外的任意一個(gè)字符
d:匹配一個(gè)數(shù)字
D:匹配一個(gè)非數(shù)字字符
s:匹配任意空白字符
S:匹配任何非空白字符
$:匹配字符串的開始位置
^:匹配字符串的結(jié)束位置
:匹配一個(gè)單詞邊界,也就是單詞和空格間的位置,比如"erb"可以匹配never中的‘er’,但是不能匹配verb中的‘er’
B:匹配非單詞邊界,比如"erb"可以匹配verb中的‘er’,但是不能匹配never中的‘er’
:匹配換行符
f:匹配換頁符
:匹配回車符
:匹配制表符
如果需要匹配特殊字符本身,需要在特殊字符前加字符進(jìn)行轉(zhuǎn)義,比如需要表示.字符需要"."。
量詞n+:匹配一個(gè)或多個(gè)n字符
n*:匹配零個(gè)或多個(gè)字符
n?:匹配零個(gè)或一個(gè)字符
n{x}:匹配x個(gè)n
n{x,}:匹配x個(gè)或更多個(gè)n
n{x,y}:匹配x-y個(gè)n字符
?=n:匹配之后緊接著n的位置
?!n:匹配之后沒有緊接著n的位置
|:左右表達(dá)式之間或關(guān)系,匹配左邊或者右邊
():在被修飾匹配次數(shù)的時(shí)候,()中的表達(dá)式可以作為整體被修飾,去匹配結(jié)果的時(shí)候,()中表達(dá)式匹配到的內(nèi)容可以被多帶帶得到。
貪婪模式與非貪婪模式在正則表達(dá)式中,貪婪與非貪婪模式的區(qū)別主要是:被量詞修飾的字表達(dá)式的匹配行為的不同,貪婪模式在整個(gè)表達(dá)式匹配成功的情況下盡可能多的匹配,非貪婪模式是在整個(gè)表達(dá)式匹配成功的前提下,盡可能少的匹配。
常見的修飾貪婪模式的量詞如下:{x,y},{x,},?,,+。非貪婪模式就是在貪婪模式的量詞后面加上一個(gè)?字符,就可以變成非貪婪模式的量詞,比如:{x,y}?,{x,}?,??,?,+?。
var str = "longen正則表達(dá)式的匹配原理舉杯邀明月、
yunxi對(duì)影成三人
boyboy"; // 貪婪模式 console.log(str.match(/.*
/)); // ["舉杯邀明月、
yunxi對(duì)影成三人
",index:9,input:"..."] // 非貪婪模式 console.log(str.match(/<>.*?/)); // ["對(duì)影成三人
",index:9,input:"..."]
在正則表達(dá)式匹配的過程中,如果子表達(dá)式匹配到的是字符內(nèi)容,而非位置的話,并且被保存在匹配的結(jié)果中,那么就認(rèn)為該子表達(dá)式是占有字符的,如果子表達(dá)式匹配的僅僅是位置,或者說匹配的內(nèi)容不保存到匹配的結(jié)果中,那么該子表達(dá)式是零寬度的,比如環(huán)視。
正則表達(dá)式的匹配過程比如上面的正則表達(dá)式/abc/,首先a取得控制權(quán),從位置0開始匹配,a匹配成功,接著往下匹配,把控制權(quán)交給b,從位置1開始匹配,直到整個(gè)正則表達(dá)式匹配完成。對(duì)于含有量詞?正則表達(dá)式/ab?c/,量詞?是貪婪模式,會(huì)優(yōu)先選擇盡可能多的匹配修飾的字符,所以該表達(dá)式會(huì)優(yōu)先選擇匹配一個(gè)b字符,當(dāng)b匹配不到時(shí)再選擇不匹配b字符。對(duì)于含有量詞的??的正則表達(dá)式,量詞??是非貪婪模式,會(huì)優(yōu)先選擇盡可能少的匹配修飾的字符,所以該表達(dá)式會(huì)優(yōu)先不匹配b字符,比如對(duì)于字符串a(chǎn)bc,a先匹配,控制權(quán)交給b??,該表達(dá)式先不匹配字符b,控制權(quán)交給c,c不能匹配abc中的b,匹配失敗進(jìn)行回溯,由b??表達(dá)式匹配字符b,再把控制權(quán)交給c,匹配成功,因此整個(gè)表達(dá)式都匹配成功。
環(huán)視環(huán)視是只進(jìn)行子表達(dá)式的匹配,不占有字符,匹配的內(nèi)容不保存到最終的匹配結(jié)果,是零寬度的,它匹配的結(jié)果就是一個(gè)位置,環(huán)視的作用相當(dāng)于對(duì)所在的位置加一個(gè)附加條件,只有滿足了這個(gè)條件,環(huán)視表達(dá)式才能匹配成功,環(huán)視有順序和逆序兩種,順序和逆序又分為肯定和否定,但是在JavaScript中只支持順序環(huán)視,下面就是順序環(huán)視的匹配過程:
(?=Expression)是順序肯定環(huán)視,含義是在位置的右側(cè)有expression。(?!Expression)是順序否定環(huán)視,含義是在位置的右側(cè)沒有expression。如下圖所示:該正則表達(dá)式的含義是:以字母或者數(shù)字組成的,并且第一個(gè)字符必須為小寫字母開頭。其匹配過程如下:
首先元字符^取得控制權(quán),匹配字符串開始位置,接著將控制權(quán)交給順序肯定環(huán)視表達(dá)式(?=[a-z]),它的含義是在位置0的右側(cè)是有a-z的小寫字母,在這里匹配成功,將控制權(quán)交給[a-z0-9]+表達(dá)式,由于(?=[a-z])是零寬度的,字符串已匹配的位置不會(huì)增加,因此對(duì)于[a-z0-9]+其匹配的起始位置仍然為0。
對(duì)于順序否定環(huán)視,是根據(jù)其順序肯定環(huán)視的匹配結(jié)果來推斷的,當(dāng)順序肯定環(huán)視匹配成功,順序否定就失敗,順序肯定匹配失敗,順序否定就成功。比如對(duì)于正則表達(dá)式/<(?!/?p)[^>]+>/,其含義是匹配所有非
的標(biāo)簽,首先順序否定環(huán)視(?!/?p)要轉(zhuǎn)換成(?=/?p),當(dāng)(?=/pb)匹配失敗時(shí),子表達(dá)式(?!/?p)才匹配成功。
捕獲組捕獲組就是把正則表達(dá)式中用()包裹的子表達(dá)式匹配的內(nèi)容,保存到內(nèi)存中以數(shù)字編號(hào)或顯示命名的組里,方便以后使用,捕獲組的編號(hào)規(guī)則,編號(hào)是按照"("出現(xiàn)的順序,從左到右,從1開始進(jìn)行編號(hào),比如如下代碼:
console.log(/(longen)(123)/.test("longen123longen")) console.log(RegExp.$1,RegExp.$2) // longen 123 // 使用replace替換,將分組內(nèi)容替換 var num = "11 22" var n = num.replace(/(d+)s*(d+)/,"$1 $2") console.log(n) // 22 11
非捕獲性分組:子表達(dá)式可以作為被整體修飾但是子表達(dá)式匹配的結(jié)果不會(huì)被存儲(chǔ),要?jiǎng)?chuàng)建一個(gè)非捕獲性分組,只需要在“(”字符的后面加上“?:”就可以了,比如:(?:Expression)。
反向引用捕獲性分組取到的內(nèi)容,不僅可以在正則表達(dá)式外部通過程序進(jìn)行引用,也可以在正則表達(dá)式內(nèi)部進(jìn)行引用,這種引用方式叫做反向引用。捕獲性分組的反向引用的寫法如:number。
反向引用的匹配原理:捕獲分組在匹配成功以后,會(huì)將子表達(dá)式匹配到的內(nèi)容,保存到內(nèi)存中一個(gè)以數(shù)字編號(hào)的組里,可以簡單的認(rèn)為是對(duì)一個(gè)局部變量進(jìn)行了賦值,這時(shí)可以通過反向引用,引用這個(gè)局部變量的值,一個(gè)捕獲分組在匹配成功之前,它的內(nèi)容是不確定的,一旦匹配成功,它的內(nèi)容就確定了,反向引用的內(nèi)容也就確定了。比如以下內(nèi)容:
var str = "longaabbcd" console.log(str.match(/([ab])1/)) ["aa",...]
對(duì)于表達(dá)式([ab]),可以匹配a,也可以匹配b,但是如果匹配成功,它的反向引用也就確定,如果捕獲分組匹配到的是a,那么反向引用也就只能匹配a,也就是說([ab])1只能匹配aa或者bb。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/93217.html
摘要:舉例一使用這個(gè)正則,打印結(jié)果為使用這個(gè)正則,打印結(jié)果為舉例二打印結(jié)果如下過濾標(biāo)簽?zāi)愫妹利惖纳虾O朕D(zhuǎn)化成你好,美麗的上海如果后面加,就會(huì)進(jìn)入非貪婪模式。如果后面不加,就會(huì)進(jìn)入貪婪模式,結(jié)果為上海。你好美麗的上海。 1.創(chuàng)建一個(gè)正則表達(dá)式 方法一:使用一個(gè)正則表達(dá)式字面量,其由包含在斜杠之間的模式組成。 var reg1 = /a/; var reg2 = /ab+c/; 方法二:調(diào)用Re...
摘要:舉例一使用這個(gè)正則,打印結(jié)果為使用這個(gè)正則,打印結(jié)果為舉例二打印結(jié)果如下過濾標(biāo)簽?zāi)愫妹利惖纳虾O朕D(zhuǎn)化成你好,美麗的上海如果后面加,就會(huì)進(jìn)入非貪婪模式。如果后面不加,就會(huì)進(jìn)入貪婪模式,結(jié)果為上海。你好美麗的上海。 1.創(chuàng)建一個(gè)正則表達(dá)式 方法一:使用一個(gè)正則表達(dá)式字面量,其由包含在斜杠之間的模式組成。 var reg1 = /a/; var reg2 = /ab+c/; 方法二:調(diào)用Re...
摘要:舉例一使用這個(gè)正則,打印結(jié)果為使用這個(gè)正則,打印結(jié)果為舉例二打印結(jié)果如下過濾標(biāo)簽?zāi)愫妹利惖纳虾O朕D(zhuǎn)化成你好,美麗的上海如果后面加,就會(huì)進(jìn)入非貪婪模式。如果后面不加,就會(huì)進(jìn)入貪婪模式,結(jié)果為上海。你好美麗的上海。 1.創(chuàng)建一個(gè)正則表達(dá)式 方法一:使用一個(gè)正則表達(dá)式字面量,其由包含在斜杠之間的模式組成。 var reg1 = /a/; var reg2 = /ab+c/; 方法二:調(diào)用Re...
摘要:特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 本以為自己收藏的站點(diǎn)多,可以很快搞定,沒想到一入?yún)R總深似海。還有很多不足&遺漏的地方,歡迎補(bǔ)充。有錯(cuò)誤的地方,還請(qǐng)斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應(yīng)和斧正,會(huì)及時(shí)更新,平時(shí)業(yè)務(wù)工作時(shí)也會(huì)不定期更...
摘要:個(gè)人前端文章整理從最開始萌生寫文章的想法,到著手開始寫,再到現(xiàn)在已經(jīng)一年的時(shí)間了,由于工作比較忙,更新緩慢,后面還是會(huì)繼更新,現(xiàn)將已經(jīng)寫好的文章整理一個(gè)目錄,方便更多的小伙伴去學(xué)習(xí)。 showImg(https://segmentfault.com/img/remote/1460000017490740?w=1920&h=1080); 個(gè)人前端文章整理 從最開始萌生寫文章的想法,到著手...
閱讀 916·2021-11-15 17:58
閱讀 3756·2021-11-12 10:36
閱讀 3873·2021-09-22 16:06
閱讀 1036·2021-09-10 10:50
閱讀 1377·2019-08-30 11:19
閱讀 3357·2019-08-29 16:26
閱讀 1008·2019-08-29 10:55
閱讀 3393·2019-08-26 13:48