JS正則表達(dá)式詳解

RegExp對(duì)象實(shí)例化

RegExp是JS的正則表達(dá)式對(duì)象,實(shí)例化一個(gè)RegExp對(duì)象有字面量構(gòu)造函數(shù)2種方式。

字面量實(shí)例化RegExp對(duì)象

var reg=/js/gi;

開(kāi)始和結(jié)束的斜線/是正則表達(dá)式的邊界,//中間的文本是正則表達(dá)式文本,后面的gi是正則表達(dá)式的修飾符。

構(gòu)造函數(shù)實(shí)例化RegExp對(duì)象

var reg=new Regex(‘js’,’gi’);

第一個(gè)參數(shù)是正則表達(dá)式文本,第二個(gè)參數(shù)是正則表達(dá)式修飾符。

RegExp對(duì)象屬性

global:RegExp 對(duì)象是否具有標(biāo)志 g。

ignoreCase:RegExp 對(duì)象是否具有標(biāo)志 i。

lastIndex:一個(gè)整數(shù),標(biāo)示開(kāi)始下一次匹配的字符位置。

multiline:RegExp 對(duì)象是否具有標(biāo)志 m。

source:正則表達(dá)式的源文本。

RegExp對(duì)象的方法

RegExp 對(duì)象有 3 個(gè)方法:test()、exec() 以及 compile()。

test()

test() 方法檢索字符串中的指定值。返回值是 true 或 false。

示例:

var reg=/js/gi;

var result=reg.test(‘I like js’);

結(jié)果:true

exec()

exec() 方法檢索字符串中的指定值。返回值是被找到的值。如果沒(méi)有發(fā)現(xiàn)匹配,則返回 null。

示例:

var reg=/js/gi;

var result=reg.exec(‘I like JS’);

結(jié)果:JS

特別注意,上面的test()和exec()方法執(zhí)行第一次結(jié)果正確的,第二次是錯(cuò)誤的,第三次又是正確的。
因?yàn)楸磉_(dá)式在使用 “g” 參數(shù)時(shí),查找工作原理如下:
找到第一個(gè) “JS”,并存儲(chǔ)其位置,即給RegExp對(duì)象lastIndex屬性賦值
如果再次運(yùn)行,則從存儲(chǔ)的位置(lastIndex屬性 )開(kāi)始檢索,發(fā)現(xiàn)后面已經(jīng)找不到,然后又重頭開(kāi)始查找,并找到下一個(gè) “JS”,并存儲(chǔ)其位置
簡(jiǎn)單的說(shuō)JS正則表達(dá)式在全文搜索模式會(huì)使用一個(gè)類(lèi)似取隊(duì)列中元素的執(zhí)行過(guò)程,最后一次執(zhí)行結(jié)果肯定是不正確,為避免這個(gè)隱藏的坑,建議大家使用test()和exec()方法時(shí)不要加g修飾符。

compile()

compile() 方法用于改變 RegExp。

compile() 既可以改變檢索模式,也可以添加或刪除第二個(gè)參數(shù)。

修飾符

g:global全文搜索,如果不添加此參數(shù),搜索到第一個(gè)匹配就會(huì)停止

i:ignore case 不區(qū)分大小寫(xiě),默認(rèn)是區(qū)分大小寫(xiě)的

m:multiple lines 多行搜索,默認(rèn)只搜索第一行

元字符

正則表達(dá)式文本部分包含原義文本字符元字符,其中的原義文本字符代表字符本身意義的字符,如abc123之類(lèi)的字符。

元字符代表有特殊含義非字母字符,如\b、\w、\d、+、*、? 等。

常用的元字符

字符 含義 字符 含義
\d 匹配任何數(shù)字字符。 + 限定符前的子模式必須出現(xiàn)1或多次。
? 限定符前的子模式必須出現(xiàn)0或1次。 . 匹配任何字符,換行符除外。
^ 字符串需以模式起始。 | 讓模式指定一連串可供選擇的子模式。
$ 字符串需以模式結(jié)束。 \s 匹配空格(包括空白字符、tab、換行符、return/enter)
* 限定符前的子模式必須出現(xiàn)0或多次。 \W 匹配任何非單詞字符。等價(jià)于 ‘[^A-Za-z0-9_]’。

更多的JS正則元字符請(qǐng)參考:http://www.runoob.com/regexp/regexp-metachar.html

字符類(lèi)

一般情況下正則表達(dá)式中的一個(gè)字符對(duì)應(yīng)字符串中的一個(gè)字符,如表達(dá)式ab的含義是ab。

表達(dá)式中用[]來(lái)定義一個(gè)字符類(lèi),表示可以匹配[]里面的這類(lèi)字符,是一個(gè)泛指,而不是一一對(duì)應(yīng)的關(guān)系。

如表達(dá)式[abc123],表示有其中一個(gè)字符串都可以匹配。

范圍類(lèi)

在字符類(lèi)里面使用橫線-連接2個(gè)數(shù)字或者字母就可以構(gòu)建一個(gè)范圍類(lèi),如[a-zA-z0-9-]表示可以匹配26個(gè)大小寫(xiě)字母和0-9的全部數(shù)字以及橫線-。

注意,要匹配橫線”-“,必須把橫線放在最后面。

預(yù)定義類(lèi)

預(yù)定義類(lèi)可以理解為JS默認(rèn)給我們寫(xiě)好的范圍類(lèi),讓我們可以使用一個(gè)簡(jiǎn)單的元字符來(lái)使用它。如”\w”就是一個(gè)預(yù)定義類(lèi),它等價(jià)于范圍類(lèi)[A-Za-z0-9_];“.”可以匹配除 “\n” 之外的任何單個(gè)字符。

邊界

邊界包含2種,一種是以字符串開(kāi)始或結(jié)尾的邊界,另一種是單詞邊界

字符 含義 字符 含義
^ 以xxx開(kāi)始 \b 單詞邊界
$ 以xxx結(jié)尾 \B 非單詞邊界

量詞

量詞表示可以匹配連續(xù)多次的元字符

字符 含義 字符 含義
? 出現(xiàn)0次或1次(最多1次) + 出現(xiàn)1次或多次(至少1次)
* 出現(xiàn)0次或多次(任意次) {n} 出現(xiàn)n次
{n,} 至少出現(xiàn)n次 {n,m} 出現(xiàn)n次到m次范圍之間

貪婪模式和非貪婪模式

JS正則表達(dá)式默認(rèn)是貪婪模式匹配,它會(huì)以最多匹配原則進(jìn)行查找,非貪婪模式可以讓表達(dá)式以最少匹配原則進(jìn)行查找。

非貪婪模式只需要在量詞后面加上”?”即可,如”123456789″字符串想以3個(gè)數(shù)字為一組進(jìn)行匹配表達(dá)式寫(xiě)法/\d{3,5}?/g。

分組

表達(dá)式中用()來(lái)定義一個(gè)分組,使元字符可以作用于一個(gè)表達(dá)式字符串組合,如/(js|php){3}/gi。

表達(dá)式中的每一個(gè)分組匹配的內(nèi)容都是一個(gè)可以捕獲的變量,可以使用$1、$2、$3… 來(lái)取值,如表達(dá)式/(\d{4})-(\d{2})-(\d{2})/中包含$1、$2、$3。如果想忽略分組匹配的內(nèi)容,需要在分組前面增加“?:”,就可以得到分組匹配之外的內(nèi)容。

前瞻

前瞻就是正則表達(dá)式后面加上斷言部分,它不但要匹配表達(dá)式部分,還需要滿足斷言部分,匹配的結(jié)果不會(huì)包含斷言部分。

正向前瞻 exp(?=assert) 如 “\w(?=\d)”

負(fù)向前瞻 exp(?!assert) 如 “\w(?!\d)”

JS正則表達(dá)式其它相關(guān)字符串處理函數(shù)

match()

stringObject.match(regexp)

match() 方法可在字符串內(nèi)檢索指定的值,或找到一個(gè)或多個(gè)正則表達(dá)式的匹配。

如果 regexp 沒(méi)有標(biāo)志 g,那么 match() 方法就只能在 stringObject 中執(zhí)行一次匹配。

如果沒(méi)有找到任何匹配的文本, match() 將返回 null。

否則,它將返回一個(gè)數(shù)組,其中存放了與它找到的匹配文本有關(guān)的信息。該數(shù)組的第 0 個(gè)元素存放的是匹配文本,而其余的元素存放的是與正則表達(dá)式的子表達(dá)式匹配的文本。

search()

stringObject.search(regexp)

search() 方法不執(zhí)行全局匹配,它將忽略標(biāo)志 g。它同時(shí)忽略 regexp 的 lastIndex 屬性,并且總是從字符串的開(kāi)始進(jìn)行檢索,這意味著它總是返回 stringObject 的第一個(gè)匹配的位置。

replace()

stringObject.replace(regexp/substr,replacement)

字符串 stringObject 的 replace() 方法執(zhí)行的是查找并替換的操作。它將在 stringObject 中查找與 regexp 相匹配的子字符串,然后用 replacement 來(lái)替換這些子串。如果 regexp 具有全局標(biāo)志 g,那么 replace() 方法將替換所有匹配的子串。否則,它只替換第一個(gè)匹配子串。

replacement 可以是字符串,也可以是函數(shù)。如果它是字符串,那么每個(gè)匹配都將由字符串替換。但是 replacement 中的 $ 字符具有特定的含義。如下表所示,它說(shuō)明從模式匹配得到的字符串將用于替換。

split()

stringObject.split(separator,howmany)

如果 separator 是包含子表達(dá)式的正則表達(dá)式,那么返回的數(shù)組中包括與這些子表達(dá)式匹配的字串(但不包括與整個(gè)正則表達(dá)式匹配的文本)

正則表達(dá)式語(yǔ)法語(yǔ)意測(cè)試工具:https://regexper.com/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容