溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在JavaScript中引用RegExp類(lèi)型

發(fā)布時(shí)間:2021-04-01 17:12:37 來(lái)源:億速云 閱讀:149 作者:Leah 欄目:web開(kāi)發(fā)

怎么在JavaScript中引用RegExp類(lèi)型?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

1、正則表達(dá)式定義

三個(gè)標(biāo)志:全局模式g,不區(qū)分大小寫(xiě)模式i,多行模式m。

1) 字面量定義

var pattern = /[fe]at/gim;

2) 構(gòu)造函數(shù)定義:

接收兩個(gè)參數(shù)——要匹配的字符串模式和可選的模式字符串(g,i,m)。

var pattern = new RegExp("[fe]at","gim");

注意:

1) 若需要匹配的字符串中包含以下元字符,就必須對(duì)它們進(jìn)行轉(zhuǎn)義:( [ { \ ^ & | ) ? * + . ] } 。

2) 由于構(gòu)造函數(shù)定義正則表達(dá)式的參數(shù)是字符串,所以在某些情況下要對(duì)字符時(shí)行雙重轉(zhuǎn)義如\n,字符\在字符串中通常被轉(zhuǎn)義為\\,而在正則表達(dá)式字符串參數(shù)中就會(huì)變成\\\\,字面量模式/\w\\hello\\123/等價(jià)的字符串為“\\w\\\\hello\\\\123”。

2、RegExp實(shí)例屬性

  • 1) global 表示是否設(shè)置了g標(biāo)志。

  • 2) ignoreCase 表示是否設(shè)置了i標(biāo)志。

  • 3) multiline 表示是否設(shè)置了m標(biāo)志。

  • 4) lastIndex 用于記錄上一次匹配結(jié)束的位置,即下一次開(kāi)始搜索下一個(gè)匹配項(xiàng)的位置,從0算起。

  • 5) Source返回正則表達(dá)式的字符串表示,按照字面量模式返回而非傳入構(gòu)造函數(shù)的字符串模式返回。

var pattern = new RegExp("\\[fe\\]at","i");
alert(pattern.source);

以上代碼返回\[fe\]at

3、RegExp實(shí)例方法

1) 繼承的toLocaleString()toString()、valueOf()方法

toLocaleString():返回正則表達(dá)式的字面量,與創(chuàng)建正則表達(dá)式的方式無(wú)關(guān)。

toString():返回正則表達(dá)式的字面量,與創(chuàng)建正則表達(dá)式的方式無(wú)關(guān)。

valueOf():返回正則表達(dá)式本身。

var pattern1 = /\[fe\]at/i);
var pattern2 = new RegExp("\\[fe\\]at","i");
alert(pattern1.toString()); // /\[fe\]at/i
alert(pattern1.toLocaleString()); // /\[fe\]at/i
alert(pattern2.toString()); // /\[fe\]at/i
alert(pattern2.toLocaleString()); // /\[fe\]at/i

2) match()方法

參數(shù):用于匹配的正則表達(dá)式。

返回值:區(qū)分match()的返回值主要是看是否設(shè)置g標(biāo)志,沒(méi)有設(shè)置g標(biāo)志時(shí)與exec()是等價(jià)的。

a. 如果設(shè)置g標(biāo)志,那么返回的是包含所有匹配項(xiàng)的數(shù)組。

b. 如果沒(méi)有設(shè)置g標(biāo)志,那么返回的是包含第一個(gè)匹配項(xiàng)的數(shù)組,第0項(xiàng)是與整個(gè)正則表達(dá)式匹配的字符串,第1項(xiàng)是是與第1個(gè)子表達(dá)式相匹配的文本(如果有的話),第2項(xiàng)是與第2個(gè)子表達(dá)式相匹配的文本(如果有的話)。

3) exec()方法

參數(shù):要應(yīng)用模式的字符串。

返回值:返回包含第一個(gè)匹配項(xiàng)信息的數(shù)組,沒(méi)有匹配項(xiàng)的情況下返回null。exec()的返回值不受g標(biāo)志影響,在不設(shè)置g標(biāo)志時(shí),在同一個(gè)字符串上多次調(diào)用exec()將會(huì)始終返回第一個(gè)匹配項(xiàng)的信息。即使設(shè)置了g標(biāo)志,一次也只返回一個(gè)匹配項(xiàng),但設(shè)置g標(biāo)志時(shí),每次調(diào)用exec()都會(huì)在字符串中繼續(xù)查找新匹配項(xiàng),會(huì)驅(qū)動(dòng)lastIndex可以模擬遍歷所有匹配,可以與match()設(shè)置g標(biāo)志時(shí)等價(jià)(區(qū)別在于遍歷所有匹配時(shí),exec()需要多次匹配,match()一次匹配即可得到所有匹配)。

返回的數(shù)組包含額外的兩個(gè)屬性:index和input。其中,index表示匹配項(xiàng)在字符串中的位置,而input表示應(yīng)用正則表達(dá)式的字符串。在數(shù)組中,第0項(xiàng)是與整個(gè)正則表達(dá)式匹配的字符串,第1項(xiàng)是是與第1個(gè)子表達(dá)式相匹配的文本(如果有的話),第2項(xiàng)是與第2個(gè)子表達(dá)式相匹配的文本(如果有的話)。

var str = "Shanghai and Beijing and Guangzhou";
var pattern = /Shanghai ( and Beijing ( and Guangzhou)?)?/gi;
var match = pattern.exec(str);
alert(match.index);//0
alert(match.input);//"Shanghai and Beijing and Guangzhou"
alert(match[0]);//"Shanghai and Beijing and Guangzhou"
alert(match[1]);//"and Beijing and Guangzhou"
alert(match[2]);//"and Guangzhou"

在不設(shè)置g標(biāo)志的情況下,同一個(gè)字符串上調(diào)用exec()始終返回第一個(gè)匹配項(xiàng)的信息。

var str = "fat eat";
var pattern = /.at/;
var match = pattern.exec(str);
alert(match.index);//0
alert(match.input);//fat eat
alert(match[0]);//fat
alert(pattern.lastIndex);//0
var match = pattern.exec(str);
alert(match.index);//0
alert(match.input);//fat eat
alert(match[0]);//fat
alert(pattern.lastIndex);//0

設(shè)置全局標(biāo)志g情況下,同一個(gè)字符串上調(diào)用exec()每次會(huì)返回一個(gè)新的匹配項(xiàng)的信息。

var str = "fat eat";
var pattern = /.at/g;
var match = pattern.exec(str);
alert(match.index);//0
alert(match.input);//fat eat
alert(match[0]);//fat
alert(pattern.lastIndex);//3
var match = pattern.exec(str);
alert(match.index);//4
alert(match.input);//fat eat
alert(match[0]);//eat
alert(pattern.lastIndex);//7

4)  test()方法

參數(shù):要應(yīng)用模式的字符串

返回值:在模式與該參數(shù)匹配的情況下返回true,否則返回false。

test()方法經(jīng)常用于if語(yǔ)句中。

問(wèn)題:

如果正則表達(dá)式帶有標(biāo)志g,使用test校驗(yàn)不同的字符串時(shí),RegExp會(huì)使用test前一個(gè)字符串得出的lastIndex去test后一個(gè)字符串,必定出錯(cuò)。

var pattern = /^[1-9]\d{4,10}$/gi;
var str = "88888";
alert(pattern.test(str));//返回true
str = "888888";
alert(pattern.test(str));//返回false

解決方法:

① 將正則表達(dá)式的 lastIndex 屬性設(shè)置為0 再用作校驗(yàn)

var pattern = /^[1-9]\d{4,10}$/gi;
var str = "88888";
alert(pattern.test(str));//返回true
str = "888888";
pattern.lastIndex=0;
alert(pattern.test(str));//返回true

② 正則表達(dá)式去掉標(biāo)志g

var pattern = /^[1-9]\d{4,10}$/i;
var str = "88888";
alert(pattern.test(str));//返回true
str = "888888";
alert(pattern.test(str));//返回true

5) 說(shuō)明:

① exec()test()是正則表達(dá)式的方法,而不是字符串的方法,它的參數(shù)才是字符串;match是字符串的方法,而不是正則表達(dá)式的方法,它的參數(shù)才是正則表達(dá)式。

② 即使設(shè)置了g標(biāo)志,exec()每次只返回一個(gè)匹配項(xiàng)。沒(méi)有設(shè)置g標(biāo)志時(shí),exec()match()執(zhí)行結(jié)果相同;設(shè)置g標(biāo)志時(shí),match()將忽略子表達(dá)式,只查找全匹配正則表達(dá)式。

③ exec()match()的區(qū)別:

a. 當(dāng)正則表達(dá)式無(wú)子表達(dá)式,并且沒(méi)有設(shè)置g標(biāo)志時(shí),exec()match()執(zhí)行結(jié)果相同,均返回第一個(gè)匹配的字符串內(nèi)容。

var pattern = new RegExp("cat") ;
var str = "onecat twocat";
alert(pattern.exec(str));//返回cat
alert(str.match(pattern));//返回cat

b. 當(dāng)正則表達(dá)式無(wú)子表達(dá)式,并且設(shè)置g標(biāo)志時(shí),exec()返回第一個(gè)匹配的字符串內(nèi)容,若存在多處匹配內(nèi)容,則match()返回的是包含所有匹配字符串的數(shù)組。

var pattern = new RegExp("cat","g") ;
var str = "onecat twocat";
alert(pattern.exec(str));//返回cat
alert(str.match(pattern));//返回cat,cat

c. 當(dāng)正則表達(dá)式有子表達(dá)式,并且沒(méi)有設(shè)置g標(biāo)志時(shí),exec()match()執(zhí)行結(jié)果相同,都查找全匹配正則表達(dá)式和子表達(dá)式,并返回包含全匹配字符串和匹配子表達(dá)式的數(shù)組。

var pattern = new RegExp("c(at)") ;
var str = "onecat twocat";
alert(pattern.exec(str));//返回cat,at
alert(str.match(pattern));//返回cat,at

d. 當(dāng)正則表達(dá)式有子表達(dá)式,并且設(shè)置g標(biāo)志時(shí),exec()match()執(zhí)行的結(jié)果不相同,match()將忽略子表達(dá)式,只查找全匹配正則表達(dá)式,并返回包含所有匹配字符串的數(shù)組。

var pattern = new RegExp("c(at)","g") ;
var str = "onecat twocat";
alert(pattern.exec(str));//返回cat,at
alert(str.match(pattern));//返回cat,cat

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI