摘要:引用就是允許在同一個(gè)正則表達(dá)式的后部引用前面的子表達(dá)式。這個(gè)數(shù)字制定了帶圓括號(hào)的子表達(dá)式在正則表達(dá)式中的位置。對(duì)正則表達(dá)式中前一個(gè)子表達(dá)式的引用,并不是指對(duì)子表達(dá)式模式的引用,而是指與那個(gè)模式匹配的文本的引用。
前言
本文主要是在讀《JavaScript高級(jí)程序語(yǔ)言設(shè)計(jì)》一書(shū)有關(guān)正則表達(dá)式的章節(jié)的知識(shí)點(diǎn)記錄,方便后續(xù)查閱。
什么是正則表達(dá)式正則表達(dá)式是用來(lái)描述字符組合的某種規(guī)則。它可以幫助驗(yàn)證字符串是否滿足某種字符組合規(guī)則或者通過(guò)某個(gè)規(guī)則查找對(duì)應(yīng)的字符序列。
JavaScript中定義正則表達(dá)式對(duì)象舉個(gè)例子:比如我想驗(yàn)證一個(gè)輸入框中輸入的是否是手機(jī)號(hào)碼,那么我們需要為這個(gè)輸入框定義一個(gè)輸入規(guī)則,比如11位字符、每個(gè)字符都必須是0-9、以及更細(xì)節(jié)的信息像第一位不能是0等規(guī)則。此時(shí)我們就可以定義一個(gè)正則表達(dá)式,將所有的規(guī)則通過(guò)正則表達(dá)出來(lái),去驗(yàn)證輸入框的內(nèi)容是否滿足正則表達(dá)式定義的規(guī)則。
JavaScript中的正則表達(dá)式對(duì)象有兩種定義方式:正則表達(dá)式直接量和RegExp()構(gòu)造函數(shù)。定義代碼如下:
//定義JavaScript正則對(duì)象的兩種方式 var pattern = /s$/; var pattern = new RegExp("s$");直接量字符
??正則表達(dá)式中所有字母和數(shù)字都是按字面含義進(jìn)行匹配的,例如"a"就可以匹配到"a"字符。
??JavaScript也支持非字母的字符匹配。正則表達(dá)式通過(guò)””+字母的形式將字母原先的含義進(jìn)行了轉(zhuǎn)義來(lái)表示其他特殊的字符。例如
匹配換行符。
??正則表達(dá)式中很多符號(hào)具有特殊含義:^ $ . * + ? = ! : | / () [] {}。如果想要匹配這些字符需要使用""進(jìn)行轉(zhuǎn)義。
??現(xiàn)在我們知道我們可以用a去匹配a字符,b去匹配b字符。那么如果我需要匹配所有的小寫(xiě)字母該怎么做?
??正則表達(dá)式使用[]來(lái)構(gòu)造一個(gè)字符類。一個(gè)字符類可以匹配它所包含的任意一個(gè)字符。例如/[abc]/就能夠匹配字母”a”、”b”或”c”中的任意一個(gè)。另外在字符類中使用^可以進(jìn)行否定操作,例如"/[^abc]/"表示匹配”a”、”b”或”c”以外的任意一個(gè)字符。
??字符類還可以使用連字符表示字符范圍,例如/[a-z]/匹配所有小寫(xiě)字母。由于某些字符類非常常用,所以正則規(guī)范了一些特殊字符表示一個(gè)特定的字符類,例如/w/等價(jià)于[a-zA-Z0-9]。
??現(xiàn)在我們有有了新的需求,就是想要某個(gè)字符類匹配多次,例如匹配5-7個(gè)數(shù)字,可以使用/d{5,7}/進(jìn)行匹配,由于某些重復(fù)種類非常常用,所以正則規(guī)范了特殊符號(hào)來(lái)表示,例如”+”表示匹配1次或多次,等價(jià)于{1,}等。
非貪婪的重復(fù)??使用重復(fù)進(jìn)行匹配時(shí)會(huì)盡可能多的進(jìn)行匹配,我們稱之為貪婪匹配。例如/a+/可以匹配一個(gè)或多個(gè)連續(xù)的字母a,當(dāng)使用”aaa”作為匹配字符串時(shí),正則表達(dá)式會(huì)匹配連續(xù)的三個(gè)a。
非貪婪匹配只需在待匹配字符后跟隨一個(gè)?,例如:”??”、”+?”、”*?”或”{1,5}?”。例如/a+?/也可以匹配一個(gè)或多個(gè)連續(xù)的字母a,但是它會(huì)盡可能少的匹配。
??選擇:字符”|”用于分隔可選擇的字符,例如/d{3}|[a-z]{4}/可以匹配三位數(shù)字或者四個(gè)小寫(xiě)字母。選擇項(xiàng)的嘗試匹配次序是從左到右的,而且發(fā)現(xiàn)匹配項(xiàng)后就會(huì)忽略后面的選擇項(xiàng)。因此正則/a|ab/匹配字符串”ab”時(shí)只會(huì)匹配到第一個(gè)字母a。
分組??將子表達(dá)式組合成一個(gè)獨(dú)立單元,這就可以使用”|”、”*”等來(lái)對(duì)這個(gè)單元進(jìn)行處理。例如/Java(script)?/可以用來(lái)匹配java或javascript,也就是script這個(gè)組合可以出現(xiàn)0-1次。
引用??()小括號(hào)除了可以將子表達(dá)式組合成一個(gè)獨(dú)立單元,還能夠定義子模式。當(dāng)一個(gè)正則表達(dá)式成功地和目標(biāo)字符串匹配時(shí),可以從目標(biāo)字符串中提取出和圓括號(hào)中的子模式相匹配的部分。后面會(huì)進(jìn)行詳細(xì)介紹。
??引用就是允許在同一個(gè)正則表達(dá)式的后部引用前面的子表達(dá)式。這是通過(guò)在字符””后加一個(gè)數(shù)字來(lái)實(shí)現(xiàn)的。這個(gè)數(shù)字制定了帶圓括號(hào)的子表達(dá)式在正則表達(dá)式中的位置。這個(gè)位置是參與計(jì)數(shù)的左括號(hào)的位置。例如/([Jj]ava([Ss]cript)?)siss(funw*)/正則中([Ss]cript)可以使用2來(lái)指代。對(duì)正則表達(dá)式中前一個(gè)子表達(dá)式的引用,并不是指對(duì)子表達(dá)式模式的引用,而是指與那個(gè)模式匹配的文本的引用。這樣,引用可以用于實(shí)施一條約束,即一個(gè)字符串各個(gè)多帶帶部分包含的是完全相同的字符。例如/‘”[‘”]/匹配位于單引號(hào)或雙引號(hào)之間的0個(gè)或多個(gè)字符,但是它并不要求左側(cè)和右側(cè)的引號(hào)匹配,如果要匹配左右的引號(hào)類型,可以使用引用/([‘”])[w]1/。
??如果不想生成帶編碼的引用,可以使用”(?:)”進(jìn)行組合,不記憶與改組相匹配的字符。
??有一些正則表達(dá)式的元素匹配的是字符之間的位置,而不是實(shí)際字符。例如b匹配一個(gè)單詞的邊界。有時(shí)稱這些元素為正則表達(dá)式的錨,因?yàn)樗鼈儗⒛J蕉ㄎ辉谀繕?biāo)字符串的特定位置上。最常見(jiàn)的錨元素是^,用來(lái)匹配字符串的開(kāi)始,錨元素$用來(lái)匹配字符串的結(jié)尾。
??任何正則表達(dá)式都可以作為錨點(diǎn)條件,如果在符號(hào)”(?=”和”)”之間加入一個(gè)表達(dá)式,它就是一個(gè)先行斷言。用來(lái)說(shuō)明圓括號(hào)內(nèi)的表達(dá)式必須正確匹配。比如要匹配一個(gè)程序設(shè)計(jì)語(yǔ)言的名字,但只在其后有冒號(hào)時(shí)才匹配,可以使用/[jJ]ava([sS]cript)?(?=:)/。
??帶有”(?!”和”)”的斷言是負(fù)向先行斷言。用以指定接下來(lái)的字符都不匹配。例如/Java(?!Script)([A-Z]w*)/,用來(lái)匹配Java后面跟一個(gè)大寫(xiě)字母和任意個(gè)ASCII單詞,但Java后面不能跟隨”Script”。
??修飾符用來(lái)說(shuō)明高級(jí)匹配模式的規(guī)則。JavaScript支持3個(gè)修飾符:i、g和m。
i:修飾符”i”用以說(shuō)明模式匹配是不區(qū)分大小寫(xiě)的。
g:修飾符”g”用以說(shuō)明模式匹配是全局的,也就是應(yīng)該檢索出字符串中的所有匹配。
m:修飾符”m”用以說(shuō)明在多行模式中執(zhí)行匹配。在這種模式下,如果待檢索的字符串包含多行,那么^和錨字符除了匹配整個(gè)字符串的開(kāi)始和結(jié)尾之外,還能夠匹配每行的開(kāi)始和結(jié)尾。比如/java/im可以匹配”Java”,也可以匹配”java is fun”。
String類型用于模式匹配的方法??JavaScript的String類型支持4種使用正則表達(dá)式的方法。
search():接收一個(gè)參數(shù)(字符串類型或者是正則對(duì)象),返回值是stringObject 中第一個(gè)與 regexp 相匹配的子串的起始位置。
replace():replace() 方法用于在字符串中用一些字符替換另一些字符,或替換一個(gè)與正則表達(dá)式匹配的子串。該方法接收兩個(gè)參數(shù),第一個(gè)參數(shù)規(guī)定子字符串或要替換的模式的 RegExp 對(duì)象。第二個(gè)參數(shù)接收一個(gè)字符串值。規(guī)定了替換文本或生成替換文本的函數(shù)。如果正則表達(dá)式設(shè)置了修飾符g,那么源字符串中所有與模式匹配的子字符串都將被替換。但replace()的功能遠(yuǎn)不止單純的替換,正則表達(dá)式中可以使用圓括號(hào)創(chuàng)建子表達(dá)式,正則表達(dá)式會(huì)記憶與每個(gè)子表達(dá)式匹配的文本。如果在替換字符串中出現(xiàn)了$加數(shù)字,那么replace()將與指定的子表達(dá)式相匹配的文本來(lái)替換。replace()的第二個(gè)參數(shù)可以接收一個(gè)函數(shù)來(lái)動(dòng)態(tài)計(jì)算替換字符串。
match():match()方法可在字符串內(nèi)檢索指定的值,或找到一個(gè)或多個(gè)正則表達(dá)式的匹配。該方法類似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置。如果設(shè)置了修飾符g,則返回所有匹配結(jié)果。沒(méi)有設(shè)置則只檢索第一個(gè)匹配。即使不是全局搜索,也會(huì)返回一個(gè)數(shù)組,這種情況下,數(shù)組的第一個(gè)元素是匹配的字符串,余下的是子表達(dá)式對(duì)應(yīng)的字符串。參數(shù)傳入字符串相當(dāng)于傳入了一個(gè)非全局的正則表達(dá)式。
split():split() 方法用于把一個(gè)字符串分割成字符串?dāng)?shù)組。語(yǔ)法是stringObject.split(separator,howmany),separator可以是字符串或正則表達(dá)式,從該參數(shù)指定的地方分割 stringObject。howmany可選。該參數(shù)可指定返回的數(shù)組的最大長(zhǎng)度。如果設(shè)置了該參數(shù),返回的子串不會(huì)多于這個(gè)參數(shù)指定的數(shù)組。如果沒(méi)有設(shè)置該參數(shù),整個(gè)字符串都會(huì)被分割,不考慮它的長(zhǎng)度。
RegExp對(duì)象??創(chuàng)建RegExp對(duì)象時(shí)接收兩個(gè)參數(shù):正則字符串和修飾符。
//注意""需要使用""進(jìn)行表示 var zipcode = new RegExp("d{5}", g);RegExp的屬性
??每個(gè)RegExp對(duì)象都包含5個(gè)屬性。
source:是一個(gè)只讀字符串,包含正則表達(dá)式的文本。
global:用來(lái)說(shuō)明這個(gè)正則表達(dá)式是否帶有修飾符g
ignoreCase:用來(lái)說(shuō)明正則表達(dá)式是否帶有修飾符i
multiline:用來(lái)說(shuō)明正則表達(dá)式是否帶有修飾符m
lastIndex:這是一個(gè)可讀寫(xiě)的整數(shù)。如果匹配模式帶有g(shù)修飾符,這個(gè)屬性存儲(chǔ)整個(gè)字符串中下一次檢索的開(kāi)始位置,這個(gè)屬性會(huì)被exec()和test()方法用到。
RegExp的方法??RegExp對(duì)象定義了兩個(gè)用于執(zhí)行模式匹配的操作方法。
exec():exec()接收一個(gè)字符串參數(shù),方法的作用就是在參數(shù)字符串中執(zhí)行匹配檢索。如果它沒(méi)有找到匹配就返回true。但如果它找到了匹配,它將返回一個(gè)數(shù)組,這個(gè)數(shù)組的第一個(gè)元素包含的是與正則表達(dá)式相匹配的字符串,余下的元素是與圓括號(hào)內(nèi)的子表達(dá)式相匹配的子串。屬性index包含了發(fā)生匹配的字符串位置,屬性input引用的是正在執(zhí)行檢索的字符串。exec()總是返回一個(gè)匹配結(jié)果,并提供本次匹配的所有相關(guān)信息。當(dāng)調(diào)用exec()的正則表達(dá)式對(duì)象具有g(shù)修飾符時(shí),它將把正則表達(dá)式對(duì)象的lastIndex屬性設(shè)置為緊挨著匹配子串的字符位置。當(dāng)再次調(diào)用exec()時(shí),它將從字符串的lastIndex位置開(kāi)始向后進(jìn)行檢索。如果exec()沒(méi)有查詢到結(jié)果,它將把lastIndex設(shè)置為0.
test():test()的運(yùn)行機(jī)制和exec()一致,只不過(guò)它只返回true和false
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/86532.html
摘要:本文內(nèi)容共正則表達(dá)式火拼系列正則表達(dá)式回溯法原理學(xué)習(xí)正則表達(dá)式,是需要懂點(diǎn)兒匹配原理的。正則表達(dá)式迷你書(shū)問(wèn)世了讓幫你生成和解析參數(shù)字符串最全正則表達(dá)式總結(jié)驗(yàn)證號(hào)手機(jī)號(hào)中文郵編身份證地址等是正則表達(dá)式的縮寫(xiě),作用是對(duì)字符串執(zhí)行模式匹配。 JS 的正則表達(dá)式 正則表達(dá)式 一種幾乎可以在所有的程序設(shè)計(jì)語(yǔ)言里和所有的計(jì)算機(jī)平臺(tái)上使用的文字處理工具。它可以用來(lái)查找特定的信息(搜索),也可以用來(lái)查...
摘要:選擇分組和引用正則表達(dá)式的語(yǔ)法還包括指定選擇項(xiàng)子表達(dá)式分組和引用前一子表達(dá)式的特殊字符。帶圓括號(hào)的表達(dá)式的另一個(gè)用途是允許在同一正則表達(dá)式的后部引用前面的子表達(dá)式。 正則表達(dá)式(regular expression)是一個(gè)描述字符模式的對(duì)象。JavaScript的 RegExp類 表示正則表達(dá)式,String和RegExp都定義了方法,后者使用正則表達(dá)式進(jìn) 行強(qiáng)大的模式匹配和文本檢索與...
摘要:如果遇到非常的復(fù)雜的匹配,正則表達(dá)式的優(yōu)勢(shì)就更加明顯了。關(guān)于正則表達(dá)式書(shū)寫(xiě)規(guī)則,可查看,上面說(shuō)的很清楚了,我就不貼出來(lái)了。替換與正則表達(dá)式匹配的子串,并返回替換后的字符串。結(jié)語(yǔ)正則表達(dá)式并不難,懂了其中的套路之后,一切都變得簡(jiǎn)單了。 前言 在正文開(kāi)始前,先說(shuō)說(shuō)正則表達(dá)式是什么,為什么要用正則表達(dá)式?正則表達(dá)式在我個(gè)人看來(lái)就是一個(gè)瀏覽器可以識(shí)別的規(guī)則,有了這個(gè)規(guī)則,瀏覽器就可以幫我們判斷...
摘要:正則表達(dá)式的意義中的正則表達(dá)式使用表示,可以使用構(gòu)造函數(shù)來(lái)創(chuàng)建對(duì)象,不過(guò)對(duì)象更多的是通過(guò)一種特殊的直接量語(yǔ)法來(lái)創(chuàng)建。用構(gòu)造函數(shù)也可以定義一個(gè)與之等價(jià)的正則表達(dá)式,代碼如下正則表達(dá)式的模式規(guī)則是由一個(gè)字符序列組成的。 正則表達(dá)式的模式匹配 正則表達(dá)式(regular expression)是一個(gè)描述字符模式的對(duì)象。javascript的RegExp對(duì)象表示正則表達(dá)式,String和Reg...
Javascript的正則表達(dá)式是前端中比較重要的部分,正則表達(dá)式主要用于字符串處理,表單驗(yàn)證等場(chǎng)合,實(shí)用高效,文章主要對(duì)JavaScript中的正則的學(xué)習(xí)與總結(jié) 正則表達(dá)式的定義 正則表達(dá)式:是一個(gè)描述字符模式的對(duì)象,JavaScrip中正則表達(dá)式用RegExp對(duì)象表示,可以使用RegExp構(gòu)造函數(shù)來(lái)創(chuàng)建正則對(duì)象 正則表達(dá)式的創(chuàng)建 1.字面量創(chuàng)建 var reg = /[a-z]/; 2.構(gòu)...
摘要:返回是一個(gè)只讀的布爾值,看這個(gè)正則表達(dá)式是否帶有修飾符。方法,它的參數(shù)是一個(gè)字符串,用對(duì)某個(gè)字符串進(jìn)行檢測(cè),如果包含正則表達(dá)式的一個(gè)匹配結(jié)果,則返回,否則返回??偨Y(jié)這次主要是說(shuō)說(shuō),中正則表達(dá)式對(duì)象的個(gè)屬性,而最需要注意的就是屬性了。 說(shuō)明 這篇文章,主要和大家聊聊JavaScript中RegExp對(duì)象的屬性。 解釋 每個(gè)RegExp對(duì)象都包含5個(gè)屬性,source、global、ign...
閱讀 2727·2021-11-23 09:51
閱讀 3319·2021-11-22 14:44
閱讀 4668·2021-11-22 09:34
閱讀 5405·2021-10-08 10:14
閱讀 2791·2021-09-22 15:47
閱讀 3590·2021-09-22 15:40
閱讀 1580·2019-08-30 15:44
閱讀 1691·2019-08-28 18:23