摘要:正則表達(dá)式一直是里比較難以掌握的點(diǎn)。在中創(chuàng)建正則的兩種方式使用字面量這就是正則表達(dá)式的字面量語法,表示正則表達(dá)式的模式,為正則表達(dá)式的標(biāo)志。字面量形式的正則表達(dá)式一般使用較多,也推薦大家盡可能使用這種形式,簡潔易讀,符合正常的使用習(xí)慣。
正則表達(dá)式一直是js里比較難以掌握的點(diǎn)。 看不懂,學(xué)不會(huì),記不住。 每次需要用到正則的時(shí)候,都需要再去查找資料。 今天花時(shí)間把正則的知識點(diǎn)總結(jié)下,希望能在理解的基礎(chǔ)上熟練掌握。
正則表達(dá)式的作用正則表達(dá)式在字符串處理方面發(fā)揮著巨大的作用,掌握了它,就能針對某一特定模式的字符串或者批量對字符串進(jìn)行處理。 雖然各個(gè)編程語言對正則的支持不同,但是差異并不大。 這里只介紹js語言中正則的使用方法。
javascript對正則表達(dá)式的支持先看一段代碼:
var formatPrice = function(price){ return price.toString().replace(/B(?=(d{3})+$)/g, ","); }
這個(gè)formatPrice函數(shù)將商品總價(jià)轉(zhuǎn)化為每三位以","分割的字符串,這是業(yè)務(wù)中常遇到的情況。 可以看到,通過使用正則,代碼變得相當(dāng)?shù)暮啙崱?/p> 在js中創(chuàng)建正則的兩種方式
使用字面量
/pattern/flags, 這就是正則表達(dá)式的字面量語法,pattern表示正則表達(dá)式的模式,flags為正則表達(dá)式的標(biāo)志。比如: /a[bc]d{2}$/gi。
其中模式和標(biāo)志的知識將會(huì)在后面詳細(xì)介紹。
字面量形式的正則表達(dá)式一般使用較多,也推薦大家盡可能使用這種形式,簡潔易讀,符合正常的使用習(xí)慣。
使用構(gòu)造函數(shù)
除了使用字面量外,還可以使用構(gòu)造函數(shù)生成正則表達(dá)式。
new RegExp(pattern [, flags]), 比如:var reg= new RegExp("[a-zA-Z]+d$", "gi")
這里構(gòu)造函數(shù)的兩個(gè)參數(shù),第一個(gè)參數(shù)可以是字符串(es5及以前)或正則表達(dá)式(es6),第二個(gè)可選參數(shù)為字符串。
當(dāng)我們事前不能確定正則表達(dá)式的值時(shí),或者正則依賴第三方輸入來動(dòng)態(tài)生成正則時(shí),需要使用這種方式。
這里要注意的一點(diǎn)是:第一個(gè)參數(shù)為一個(gè)字符串時(shí),當(dāng)我們使用正則里的特殊字符,比如d或等時(shí),需要對進(jìn)行轉(zhuǎn)義,也就是寫成d或的形式,因?yàn)?b>在字符串里有特殊含義。
由于正則的使用場景主要是字符串處理,所以字符串類提供了很多方法使用正則表達(dá)式。比如:
str.replace(regexp|substr, newSubStr|function) str.search(regexp) str.match(regexp) str.split([separator[, limit]])
另外,正則表達(dá)式本身也提供了處理字符串的方法,比如:
regexObj.exec(str)
regexObj.test(str)
這些方法將再后面介紹
正則表達(dá)式的語法 flags - 標(biāo)識符g - global,全局匹配,找到所有的匹配,而不是在第一個(gè)匹配后停止
i - ignoreCase 忽略大小寫
m - multiline 多行搜索,不使用"m"模式時(shí),整個(gè)字符串會(huì)被當(dāng)做一行,換行符也被當(dāng)做正則里的一個(gè)字符,使用"m"模式時(shí),字符串換行后的內(nèi)容會(huì)被當(dāng)做新的一行。
元字符正則表達(dá)式有兩種基本字符類型組成:
原義字符 - 代表他們本身含義的字符
元字符 - 在正則表達(dá)式中有特殊含義的非字母字符
比如: . * + ? () [] {} ^ $ |
字符類. - 匹配任意單個(gè)字符,行結(jié)束符除外
d - 匹配任意阿拉伯?dāng)?shù)字,相當(dāng)于[0-9]
D - 匹配任意一個(gè)不是阿拉伯?dāng)?shù)字的字符,相當(dāng)于1, 這里^用在[]中表示取反的意思。
w - 匹配任意阿拉伯字母,數(shù)字和下劃線, 相當(dāng)于[0-9a-zA-Z_]
W - 與w相反, 相當(dāng)于2
s - 匹配一個(gè)空白符,包括空格符,制表符,換行符,換頁符和其他空格字符。
S - 匹配一個(gè)非空白符,與上面相反
- 匹配一個(gè)水平制表符
- 匹配一個(gè)回車符
- 匹配一個(gè)換行符
v - 匹配一個(gè)垂直制表符
還有其他一些不常用的字符類,具體可查閱MDN文檔
字符集合[abc] - 又叫字符組,表示匹配集合中的任意一個(gè)字符,可以用-來指定范圍
[^abc] - 反義字符組,匹配不是集合中字符的一個(gè)字符,可以用-來指定范圍
邊界^ - 不使用在[]中時(shí),表示匹配輸入開始
$ - 匹配輸入結(jié)尾
- 匹配零寬單詞邊界
B - 匹配零寬非單詞邊界,與上面b含義相反。
量詞? - 匹配0次或1次
+ - 匹配一次或多次
* - 匹配0次或多次
{n} - 匹配n次
{m,n} - 匹配最少m次,最多n次
{m,} - 匹配最少m次
貪婪模式和非貪婪模式舉個(gè)例子, /d{3,6}/g,這樣一個(gè)正則表達(dá)式如果匹配字符串"234955033",是匹配3或4,5,6個(gè)數(shù)字呢?
js中正則表達(dá)式會(huì)默認(rèn)盡可能多的匹配,也就是匹配6個(gè)數(shù)字,即貪婪模式。
非貪婪模式則是讓正則表達(dá)式盡可能少的匹配,也就是只匹配3個(gè)數(shù)字,正則要使用非貪婪模式,只需要在量詞后面加上?即可。
下面一個(gè)例子:
"123456789".replace(/d{3,6}/g, "X") //貪婪模式,結(jié)果為"XX" "123456789".replace(/d{3,6}?/g, "X") //非貪婪模式,結(jié)果為"XXX"分組
() - 將正則表達(dá)式分組,以控制量詞的作用范圍,比如:baron{3} 和 (baron){3},二者是有區(qū)別的。
| - 表示 或,也可以配合()進(jìn)行使用,比如: foo|bar 和 fo(o|b)ar
反向引用和忽略分組有時(shí),我們在匹配到正則對應(yīng)的字符串時(shí),還想要使用匹配到的部分內(nèi)容,這時(shí)候可以使用$1,$2,$3等符號引用分組捕獲的內(nèi)容。
比如:
"12/03/2017".replace(/(d{2})/(d{2})/(d{4})/, "$3-$1-$2") //輸出2017-12-03
這里為了獲得年月日的引用,使用()給正則添加了三個(gè)分組,然后就可以從前往后分別用$1 $2 $3代替分組捕獲的內(nèi)容。
所有()里匹配到的內(nèi)容默認(rèn)都會(huì)被捕獲到,有時(shí)候,我們只是想要使用()簡單的分組功能,而不需要讓正則表達(dá)式捕獲分組內(nèi)容,此時(shí),只需要在分組內(nèi)添加?:即可,比如:
"12/03/2017".replace(/(d{2})/(?:d{2})/(d{4})/, "$2-$1") //輸出2017-12月,第二個(gè)分組的內(nèi)容被忽略。前瞻,后顧和斷言
這里出現(xiàn)了三個(gè)新的概念,但其實(shí)他們也很簡單。
首先,我們要分清何為前,何為后。
正則匹配字符串是從前往后解析,所以,往字符串尾部方向叫前瞻,往字符串頭部方向叫后顧。
js中的正則表達(dá)式支持前瞻不支持后顧,所以這里只介紹前瞻。
前瞻一般結(jié)合斷言使用,其實(shí)斷言(assert)就相當(dāng)于給正則加的一個(gè)限制條件 -- 表示匹配項(xiàng)不僅要符合正則表達(dá)式,而且要符合斷言給出的條件。
正向前瞻 - exp(?=assert),比如/d{2}(?=a)/ 表示匹配兩個(gè)數(shù)字且后面必須有字母a跟隨
負(fù)向前瞻 - exp(?!assert),比如/d{2}(?!a)/ 表示匹配兩個(gè)數(shù)字且后面沒有字母a跟隨
注意: 斷言只是相當(dāng)于正則的條件,并不會(huì)真正的匹配相應(yīng)的字符。
我們再來分析開頭給出的那段代碼:
price.toString().replace(/B(?=(d{3})+$)/g, ","); 正則 /B(?=(d{3})+$)/g中, d{3}+$表示以一個(gè)或多個(gè)三個(gè)數(shù)字結(jié)尾, ?=表示這部分是斷言,是正則的條件,即匹配一個(gè)零寬的非單詞邊界,且后面有(3,6,9...)個(gè)數(shù)字字符的情況js中正則表達(dá)式api 正則的實(shí)例屬性
一個(gè)正則表達(dá)式的實(shí)例具有以下一些實(shí)例屬性
multiline - 布爾值,表示正則是否多行匹配,對應(yīng)于標(biāo)志中的"m"
global - 布爾值,表示是否全局匹配,對應(yīng)于標(biāo)志中的"g"
ignoreCase - 布爾值,表示是否忽略大小寫,對應(yīng)于標(biāo)志中的"i"
source - 字符串,是正則表達(dá)式模式的字符串表示,比如/d{2}ac/gi的source屬性就是"d{2}ac", 該值不會(huì)包含正則兩邊的//和標(biāo)志gi,也不會(huì)像構(gòu)造函數(shù)參數(shù)那樣對進(jìn)行轉(zhuǎn)義。
lastIndex - 整數(shù),表示下一次匹配的起始位置,該值只有在"g"模式下才有用,在不全局匹配時(shí)始終是0
正則的實(shí)例方法正則表達(dá)式主要有兩個(gè)實(shí)例方法test和exec。
假設(shè)regexp表示一個(gè)正則的實(shí)例,str表示一個(gè)字符串,那么
regexp.test(str) - 返回一個(gè)布爾值,如果找到匹配項(xiàng),返回true,否則false。
reg.exex(str) - 返回一個(gè)數(shù)組, 數(shù)組第一項(xiàng)為匹配到的字符串,后面項(xiàng)依次為分組捕獲到的信息,該數(shù)組還具有input和index兩個(gè)屬性,input表示進(jìn)行匹配的字符串 - 即參數(shù)str,index表示匹配到的字符串的起始位置。
這里要注意的是:應(yīng)用了全局"g"標(biāo)志和沒有全局"g"標(biāo)志的同一個(gè)模式的正則,對于同一個(gè)字符串,兩種方法的表現(xiàn)可能是不同的。 因?yàn)槿绻麤]有全局標(biāo)識,每次都會(huì)從字符串起始位置0開始匹配,而應(yīng)用了"g",會(huì)從上次匹配的結(jié)束位的下一位開始匹配。
正則的靜態(tài)屬性正則的構(gòu)造函數(shù)RegExp具有一些靜態(tài)屬性,這些屬性中保存著最新一次正則匹配的信息。
比如RegExp.$1-$9中,保存著最近一次匹配中分組捕獲到的信息。
還有一些其他的靜態(tài)屬性,但平時(shí)使用較少,不再介紹,具體可查閱MDN文檔。
String.prototype.search(regexp) - 返回匹配到的子字符串的索引或者-1, 會(huì)忽略正則中的"g"標(biāo)志
String.prototype.match(regexp) - 返回一個(gè)數(shù)組,這里是否有"g"標(biāo)識會(huì)對返回值產(chǎn)生影響,如果正則沒有"g"標(biāo)志,那么返回的數(shù)組的上面正則的exec返回的數(shù)組形式相同。 如果有"g"標(biāo)志,返回的是一個(gè)包含所有匹配子字符串的數(shù)組,且該數(shù)組也不再有input和index屬性。
String.prototype.split(regexp) - split的參數(shù)除了是一個(gè)字符串外,還可以是一個(gè)正則表達(dá)式。
String.prototype.replace(str|regexp, replaceStr|function)
字符串的replace是一個(gè)非常強(qiáng)大的方法,來看一個(gè)例子:
//我們想把"a1b2c3d4e5"這個(gè)字符串替換成字母后數(shù)字都加1,變成"a2b3c4d5e6" "a1b2c3d4e5".replace(/d/g, function(match, index, origin){ return parseInt(match) + 1 })
以上就是關(guān)于正則的全部總結(jié),精力有限,寫的比較亂,見諒。
這里推薦一個(gè)非常好的介紹js正則表達(dá)式的課程慕課網(wǎng)-javaScript正則表達(dá)式
《javascript高級程序設(shè)計(jì)》
Regexper正則圖形化工具
MDN正則表達(dá)式
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/95967.html
摘要:本文內(nèi)容共正則表達(dá)式火拼系列正則表達(dá)式回溯法原理學(xué)習(xí)正則表達(dá)式,是需要懂點(diǎn)兒匹配原理的。正則表達(dá)式迷你書問世了讓幫你生成和解析參數(shù)字符串最全正則表達(dá)式總結(jié)驗(yàn)證號手機(jī)號中文郵編身份證地址等是正則表達(dá)式的縮寫,作用是對字符串執(zhí)行模式匹配。 JS 的正則表達(dá)式 正則表達(dá)式 一種幾乎可以在所有的程序設(shè)計(jì)語言里和所有的計(jì)算機(jī)平臺(tái)上使用的文字處理工具。它可以用來查找特定的信息(搜索),也可以用來查...
摘要:如果你知道正則表達(dá)式模式將會(huì)改變,或者你事先不知道什么模式,而是從另一個(gè)來源獲取,如用戶輸入,這些情況都可以使用構(gòu)造函數(shù)。 為什么要使用正則表達(dá)式 正則表達(dá)式通過由普通字符和特殊字符組成的文字模板完成對字符串的校驗(yàn),搜索,替換。在javascript中類似這樣 /^1d{10}$/ 上面的這個(gè)簡單的正則用來匹配手機(jī)號至于說正則表達(dá)式到底有什么意義,借由《精通正則表達(dá)式》里面的一句話來概...
摘要:簡言本文給出了兩個(gè)密碼強(qiáng)度的正則表達(dá)式方案,一個(gè)簡單,一個(gè)更復(fù)雜和安全。要寫出正確的正則表達(dá)式,先要定義表達(dá)式規(guī)則。重復(fù)在正則表達(dá)式中用來表示元素重復(fù)出現(xiàn)的次數(shù)。你可以根據(jù)項(xiàng)目需要,自己調(diào)整上述正則表達(dá)式。 簡言 本文給出了兩個(gè)密碼強(qiáng)度的正則表達(dá)式方案,一個(gè)簡單,一個(gè)更復(fù)雜和安全。并分別給出了兩個(gè)方案的解析和測試程序。一般大家可以根據(jù)自己的項(xiàng)目的實(shí)際需要,自行定義自己的密碼正則約定。 ...
摘要:首先推薦幾個(gè)正則表達(dá)式編輯器正則表達(dá)式是一種查找以及字符串替換操作。此表所列的常用正則表達(dá)式,除個(gè)別外均未在前后加上任何限定,請根據(jù)需要,自行處理。例如對而言,則采用一對引號來確定正則表達(dá)式的邊界。 這篇文章本來很早就要寫的,拖了挺久的,現(xiàn)在整理下,供大家學(xué)習(xí)交流哈! 基本概念 正則表達(dá)式是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為元字符)。模式描述在搜...
摘要:最全正則表達(dá)式總結(jié)驗(yàn)證號手機(jī)號中文郵編身份證地址等是正則表達(dá)式的縮寫,作用是對字符串執(zhí)行模式匹配。學(xué)習(xí)目標(biāo)了解正則表達(dá)式語法在中使用正則表達(dá)式在中使 JS高級技巧 本篇是看的《JS高級程序設(shè)計(jì)》第23章《高級技巧》做的讀書分享。本篇按照書里的思路根據(jù)自己的理解和經(jīng)驗(yàn),進(jìn)行擴(kuò)展延伸,同時(shí)指出書里的一些問題。將會(huì)討論安全的類型檢測、惰性載入函數(shù)、凍結(jié)對象、定時(shí)器等話題。1. 安全的類型檢測...
閱讀 2645·2021-11-23 09:51
閱讀 910·2021-09-24 10:37
閱讀 3630·2021-09-02 15:15
閱讀 1972·2019-08-30 13:03
閱讀 1893·2019-08-29 15:41
閱讀 2638·2019-08-29 14:12
閱讀 1436·2019-08-29 11:19
閱讀 3313·2019-08-26 13:39