摘要:構(gòu)造函數(shù)可以有兩個(gè)字符串參數(shù),第一個(gè)參數(shù)包含正則表達(dá)式的主體部分。只讀的布爾值,說(shuō)明這個(gè)正則表達(dá)式是否帶有修飾符。中正則的擴(kuò)展構(gòu)造函數(shù)在中,只能接受字符串作為參數(shù),允許其直接接受正則表達(dá)式作為參數(shù)。
上文傳送門:初探正則表達(dá)式
正則表達(dá)式是一個(gè)描述字符模式的對(duì)象,JavaScript 的 RegExp 類表示正則表達(dá)式,String 和 RegExp 都定義了方法,后者使用正則表達(dá)式進(jìn)行強(qiáng)大的模式匹配和文本檢索于替換功能。JavaScript 的正則表達(dá)式語(yǔ)法是 Perl5 的正則表達(dá)式語(yǔ)法的子集。
JS中正則表達(dá)式的定義JavaScript 中的正則表達(dá)式用RegWxp對(duì)象表示,可以使用RegExp()構(gòu)造函數(shù)來(lái)創(chuàng)建RegExp對(duì)象,不過(guò)RegExp對(duì)象更多的是通過(guò)一種特殊的直接量語(yǔ)法來(lái)創(chuàng)建。就像通過(guò)引號(hào)包裹字符的方式來(lái)定義字符串直接量一樣,正則表達(dá)式直接量定義為包含在一對(duì)斜杠(/)之間的字符,比如:
var someReg = /s$/ var someReg2 = new RegExp("s$")
其實(shí),這兩個(gè)表達(dá)式是等價(jià)的,都匹配以字母s結(jié)尾的字符串,只不過(guò)第一個(gè)以直接量定義,第二個(gè)以正則表達(dá)式定義。
js中正則表達(dá)式的修飾符修飾符 | 說(shuō)明 |
---|---|
i | 執(zhí)行不區(qū)分大小寫(xiě)的匹配 |
g | 執(zhí)行一個(gè)全局匹配,即找到所有匹配而不是找到一個(gè)就停止 |
m | 多行匹配模式 ^ 匹配一行的開(kāi)頭和字符串的開(kāi)頭 $ 匹配行的結(jié)束和字符串的結(jié)束 |
String 支持4種使用正則表達(dá)式的方法。
1. search()"JavaScript".search(/script/i);
search() 的參數(shù)是一個(gè)正則表達(dá)式,返回第一個(gè)與之匹配的字串的起始位置,如果到不到匹配的字串,它將返回 -1,如果它的參數(shù)不是正則表達(dá)式,則首先會(huì)通過(guò)RegExp構(gòu)造函數(shù)將他轉(zhuǎn)化成正則表達(dá)式,它不支持全局搜索,因?yàn)樗雎哉齽t表達(dá)式中的修飾符 g。上面的表達(dá)式將返回 4。
2. replace()text.replace(/javascript/gi, "JavaScript");
replace() 用來(lái)執(zhí)行檢索和替換操作。其中第一個(gè)參數(shù)是一個(gè)正則表達(dá)式,第二個(gè)參數(shù)是要進(jìn)行替換操作的字符串。這個(gè)方法會(huì)對(duì)調(diào)用它的字符串進(jìn)行檢索,使用指定的模式來(lái)匹配。如果 replace() 的第一個(gè)參數(shù)是一個(gè)字符串,那么它將直接搜索這個(gè)字符串,而不是和 search() 一樣先通過(guò) RegExp()將它轉(zhuǎn)換成正則表達(dá)式。上面的表達(dá)式將文本中所有的 javascript (不區(qū)分大小寫(xiě))統(tǒng)一替換為 JavaScript。
3. march():"1 and 2 and 3".match(/d+g);
match() 方法是最常用的String正則表達(dá)式方法。它唯一的參數(shù)就是一個(gè)正則表達(dá)式,返回的是一個(gè)匹配結(jié)果組成的數(shù)組。如果該表達(dá)式設(shè)置了修飾符 g,則該方法反悔的數(shù)組中包括了字符串中所有匹配結(jié)果。如果這個(gè)這個(gè)正則表達(dá)式?jīng)]有設(shè)置修飾符 g,它只檢索第一個(gè)匹配。但是即使它不是全局匹配,它也返回一個(gè)數(shù)組,在這種情況下,數(shù)組的第一個(gè)元素就是匹配的字符串,剩下的元素則是正則表達(dá)式中用圓括號(hào)擴(kuò)起來(lái)的子表達(dá)式。上面代碼返回 ["1","2","3"]
4. split()"123,456,789".split(",");
這個(gè)方法將調(diào)用他的字符串拆分成一個(gè)字串組成的數(shù)組,使用的分隔符是 split() 的參數(shù),它的參數(shù)也可以是一個(gè)正則表達(dá)式。上面的代碼返回 ["123","456","789"]。
RegExp對(duì)象除了 RegExp() 構(gòu)造函數(shù)以外,RegExp 對(duì)象還支持三個(gè)方法和一些屬性。
RegExp()構(gòu)造函數(shù)可以有兩個(gè)字符串參數(shù),第一個(gè)參數(shù)包含正則表達(dá)式的主體部分。需要注意的是不管是字符串直接量還是正則表達(dá)式,都是用 作為轉(zhuǎn)義字符的前綴,因此當(dāng)給構(gòu)造函數(shù)傳入一個(gè)字符串表述的正則表達(dá)式時(shí),必須要將 替換成 。如果提供第二個(gè)參數(shù),它就制定正則表達(dá)式的修飾符。
var thisReg = new RegExp("d{5}","g");
RegExp的屬性source: 只讀的字符串,包含正則表達(dá)式的文本。
global: 只讀的布爾值,說(shuō)明這個(gè)正則表達(dá)式是否帶有修飾符 g。
ignoreCase: 只讀的布爾值,說(shuō)明這個(gè)正則表達(dá)式是否帶有修飾符 i。
multiline: 只讀的布爾值,說(shuō)明這個(gè)正則表達(dá)式是否帶有修飾符 m。
lastIndex: 可讀寫(xiě)的整數(shù),如果這個(gè)正則表達(dá)式帶有修飾符 g ,這個(gè)屬性儲(chǔ)存在整個(gè)字符串中下次檢索的開(kāi)始位置,這個(gè)屬性會(huì)被 exec() 和 test() 方法用到。
RegExp的方法RegExp對(duì)象定義了兩個(gè)用于執(zhí)行模式匹配操作的方法。
1. exec()它與我們之前介紹的 match() 相似,只是它的參數(shù)是一個(gè)字符串,而 match() 的參數(shù)是一個(gè)RegExp對(duì)象。
exec() 對(duì)一個(gè)指定的字符串執(zhí)行匹配檢索。如果它沒(méi)有找點(diǎn)任何匹配,它就返回 null,但是如果他找到一個(gè)匹配,它將返回一個(gè)數(shù)組,這個(gè)數(shù)組第一個(gè)元素包含的是與正則表達(dá)式相匹配的字符串,余下的就是正則表達(dá)式括號(hào)內(nèi)的子表達(dá)式。
和 match() 不同,不管正則表達(dá)式是否具有全局修飾符 g,exec() 都會(huì)返回一樣的數(shù)組。當(dāng)調(diào)用 exec() 的正則表達(dá)式對(duì)象具有修飾符 g 的時(shí)候,它把當(dāng)前正則表達(dá)式的 lastindex 屬性設(shè)置為緊挨著匹配字串的字符位置。當(dāng)同一個(gè)字符串第二次調(diào)用 exec() 的時(shí)候,他將會(huì)從 lastIndex 所指示的字符位置開(kāi)始檢索。如果沒(méi)有任何匹配結(jié)果,他將會(huì)把 lastIndex 設(shè)置為 0(我們也可以在任何時(shí)候進(jìn)行設(shè)置)。
2. test()調(diào)用 test() 和調(diào)用 exec() 等價(jià),當(dāng) exec() 的返回結(jié)果不是 null 的時(shí)候,test() 返回 true。由于這種等價(jià)性,當(dāng)一個(gè)全局表達(dá)式調(diào)用 test() 時(shí),它的行為和 exec() 一樣。
ES6中正則的擴(kuò)展 RegExp構(gòu)造函數(shù)在ES5中,RegExp() 只能接受字符串作為參數(shù),ES6允許其直接接受正則表達(dá)式作為參數(shù)。
let regex = new RegExp(/xyz/i)
字符串的正則方法ES6中將字符串對(duì)象的4個(gè)正則方法在語(yǔ)言內(nèi)部全部調(diào)用 RegExp 的實(shí)例方法,使得所有與正則有關(guān)的方法全部都定義在了 RegExp 對(duì)象上。
如 String.prototype.match 調(diào)用 RegExp.prototype[Symbol.match]
u修飾符ES6對(duì)正則表達(dá)式增加了 u 修飾符,含義為“Unicode模式”,用來(lái)正確處理大于 uFFFF 的Unicode字符。
y修飾符ES6還為正則表達(dá)式添加了 y 修飾符。他的作用和 g 修飾符類似,也是全局匹配,后一次匹配都從上一次匹配成功的下一位置開(kāi)始。不同之處在于,g 修飾符只要剩余位置中存在匹配就行,而 y 修飾符會(huì)確保匹配從剩余的第一個(gè)位置開(kāi)始。g 修飾符會(huì)忽略非法字符, y 不會(huì)。
let s = "aaa_aa_a"; let r1 = /a+/g; let r2 = /a+/y; r1.exec(s) // ["aaa"] r2.exec(s) // ["aaa"] r1.exec(s) // ["aa"] r2.exec(s) // nullsticky屬性
與 y 修飾符對(duì)應(yīng),ES6的正則對(duì)象對(duì)了 sticky 屬性,用來(lái)表示是否設(shè)置了 y 修飾符。
flags屬性ES6為正則表達(dá)式新增了 flags 屬性,返回正則表達(dá)式的修飾符。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95028.html
摘要:注意本文將正則與中的正則分開(kāi)討論。正則零寬斷言更多參考各種語(yǔ)言對(duì)于正則不同支持參考單行模式與多行模式通過(guò)設(shè)置正則表達(dá)式后的修飾符可開(kāi)啟對(duì)應(yīng)的匹配模式單行模式和多行模式。 最近這段時(shí)間幫同學(xué)處理一些文檔, 涉及到一些結(jié)構(gòu)化文檔的工作大部分都得使用正則表達(dá)式, 之前對(duì)于正則的認(rèn)識(shí)大多來(lái)源于語(yǔ)言書(shū)上那幾頁(yè)的介紹, 自己也沒(méi)有用過(guò)幾次。這里將我之前感到模糊的概念作個(gè)整理。因?yàn)閷?duì)JS了解多點(diǎn),所...
摘要:控制權(quán)和傳動(dòng)這兩個(gè)詞可能在搜一些博文或者資料的時(shí)候會(huì)遇到,這里做一個(gè)解釋先控制權(quán)是指哪一個(gè)正則子表達(dá)式可能為一個(gè)普通字符元字符或元字符序列組成在匹配字符串,那么控制權(quán)就在哪。 溫馨提示:文章很長(zhǎng)很長(zhǎng),保持耐心,必要時(shí)可以跳著看,當(dāng)然用來(lái)查也是不錯(cuò)的。 正則啊,就像一座燈塔,當(dāng)你在字符串的海洋不知所措的時(shí)候,總能給你一點(diǎn)思路;正則啊,就像一臺(tái)驗(yàn)鈔機(jī),在你不知道用戶提交的鈔票真假的時(shí)候,...
摘要:表示非單詞字符,等效于正則教程返回完整的字符串,因?yàn)椋形乃阕魇欠菃卧~字符。行首行尾,修飾符形式修飾符的作用是修改和在正則表達(dá)式中的作用,讓它們分別表示行首和行尾。 正則 描述 正則 描述 f 匹配換頁(yè)符 匹配制表符 匹配換行符 v 匹配垂直制表符 匹配回車 s 匹配單個(gè)空格,等同于[f v]; S...
摘要:最全正則表達(dá)式總結(jié)驗(yàn)證號(hào)手機(jī)號(hào)中文郵編身份證地址等是正則表達(dá)式的縮寫(xiě),作用是對(duì)字符串執(zhí)行模式匹配。學(xué)習(xí)目標(biāo)了解正則表達(dá)式語(yǔ)法在中使用正則表達(dá)式在中使 JS高級(jí)技巧 本篇是看的《JS高級(jí)程序設(shè)計(jì)》第23章《高級(jí)技巧》做的讀書(shū)分享。本篇按照書(shū)里的思路根據(jù)自己的理解和經(jīng)驗(yàn),進(jìn)行擴(kuò)展延伸,同時(shí)指出書(shū)里的一些問(wèn)題。將會(huì)討論安全的類型檢測(cè)、惰性載入函數(shù)、凍結(jié)對(duì)象、定時(shí)器等話題。1. 安全的類型檢測(cè)...
摘要:說(shuō)來(lái)慚愧,做前端快三年對(duì)于正則表達(dá)式的應(yīng)用還是很淺薄,大家都知道正則的速度基本上是最快的,但就是懶得去記那些語(yǔ)法和規(guī)則,這次項(xiàng)目中多次用到了需要匹配替換的動(dòng)作,終于下定決心去研究一下了。 說(shuō)來(lái)慚愧,做前端快三年對(duì)于正則表達(dá)式的應(yīng)用還是很淺薄,大家都知道正則的速度基本上是最快的,但就是懶得去記那些語(yǔ)法和規(guī)則,這次項(xiàng)目中多次用到了需要匹配替換的動(dòng)作,終于下定決心去研究一下了。 實(shí)例化正則對(duì)...
閱讀 2117·2023-04-25 19:03
閱讀 1269·2021-10-14 09:42
閱讀 3456·2021-09-22 15:16
閱讀 1029·2021-09-10 10:51
閱讀 1660·2021-09-06 15:00
閱讀 2435·2019-08-30 15:55
閱讀 516·2019-08-29 16:22
閱讀 916·2019-08-26 13:49