日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

JavaScript正则表达式

發(fā)布時(shí)間:2025/5/22 javascript 163 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript正则表达式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

本文主要是在讀《JavaScript高級(jí)程序語(yǔ)言設(shè)計(jì)》一書有關(guān)正則表達(dá)式的章節(jié)的知識(shí)點(diǎn)記錄,方便后續(xù)查閱。

什么是正則表達(dá)式

正則表達(dá)式是用來(lái)描述字符組合的某種規(guī)則。它可以幫助驗(yàn)證字符串是否滿足某種字符組合規(guī)則或者通過(guò)某個(gè)規(guī)則查找對(duì)應(yīng)的字符序列。

舉個(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ì)象

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)表示其他特殊的字符。例如\n匹配換行符。
??正則表達(dá)式中很多符號(hào)具有特殊含義:^ $ . * + ? = ! : | / () [] {}。如果想要匹配這些字符需要使用"\"進(jìn)行轉(zhuǎn)義。

字符類

??現(xiàn)在我們知道我們可以用a去匹配a字符,b去匹配b字符。那么如果我需要匹配所有的小寫字母該怎么做?
??正則表達(dá)式使用[]來(lái)構(gòu)造一個(gè)字符類。一個(gè)字符類可以匹配它所包含的任意一個(gè)字符。例如/[abc]/就能夠匹配字母”a”、”b”或”c”中的任意一個(gè)。另外在字符類中使用^可以進(jìn)行否定操作,例如'/[^abc]/'表示匹配”a”、”b”或”c”以外的任意一個(gè)字符。
??字符類還可以使用連字符表示字符范圍,例如/[a-z]/匹配所有小寫字母。由于某些字符類非常常用,所以正則規(guī)范了一些特殊字符表示一個(gè)特定的字符類,例如/\w/等價(jià)于[a-zA-Z0-9]。

重復(fù)

??現(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à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è)單獨(dú)部分包含的是完全相同的字符。例如/‘”[‘”]/匹配位于單引號(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)字符串的特定位置上。最常見的錨元素是^,用來(lá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è)大寫字母和任意個(gè)ASCII單詞,但Java后面不能跟隨”Script”。

修飾符

??修飾符用來(lái)說(shuō)明高級(jí)匹配模式的規(guī)則。JavaScript支持3個(gè)修飾符:i、g和m。

  • i:修飾符”i”用以說(shuō)明模式匹配是不區(qū)分大小寫的。

  • g:修飾符”g”用以說(shuō)明模式匹配是全局的,也就是應(yīng)該檢索出字符串中的所有匹配。

  • m:修飾符”m”用以說(shuō)明在多行模式中執(zhí)行匹配。在這種模式下,如果待檢索的字符串包含多行,那么^和錨字符除了匹配整個(gè)字符串的開始和結(jié)尾之外,還能夠匹配每行的開始和結(jié)尾。比如/java/im可以匹配”Java”,也可以匹配”java\nis 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è)可讀寫的整數(shù)。如果匹配模式帶有g(shù)修飾符,這個(gè)屬性存儲(chǔ)整個(gè)字符串中下一次檢索的開始位置,這個(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位置開始向后進(jìn)行檢索。如果exec()沒(méi)有查詢到結(jié)果,它將把lastIndex設(shè)置為0.

  • test():test()的運(yùn)行機(jī)制和exec()一致,只不過(guò)它只返回true和false

  • 總結(jié)

    以上是生活随笔為你收集整理的JavaScript正则表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。