摘要:前一篇淺入正則一了解了實(shí)例化一個(gè)對(duì)象的原型方法的對(duì)象屬性這些基礎(chǔ),大致知道正則怎么用,這一篇主要想了解一下正則怎么寫(xiě)。
with (javascript)
前一篇淺入正則(一)了解了實(shí)例化一個(gè)RegExp對(duì)象、RegExp的原型方法、RegExp的對(duì)象屬性這些基礎(chǔ),大致知道正則怎么用,這一篇主要想了解一下正則怎么寫(xiě)。
元字符元字符表隨便就查得到,但這是會(huì)寫(xiě)正則最重要的基礎(chǔ),這里簡(jiǎn)單分成兩類(lèi)并按我的理解簡(jiǎn)單注釋。
運(yùn)算符 & 限定符
{ "": "除語(yǔ)義類(lèi)元字符中的使用, 為轉(zhuǎn)義字符,比如想要匹配一個(gè)"(",直接使用"("會(huì)被認(rèn)作分組的開(kāi)始,需要使用轉(zhuǎn)義, "/(/"", "^": { "開(kāi)頭": "在非"[]"中使用,表示匹配開(kāi)頭的意思,如果RegExp對(duì)象設(shè)置多行(m)屬性,也會(huì)匹配換行符 及 之后的位置", "非": "在"[]"中,表示取反,例如:"/[^a]/",表示匹配不是a的字符" }, "$": "匹配結(jié)束的位置,如果RegExp對(duì)象設(shè)置多行(m)屬性,也會(huì)匹配換行符 及 之前的位置", "*": "任意的意思,表示匹配前面緊接著的子表達(dá)式0次或多次", "+": "表示匹配前面緊接著的子表達(dá)式1次或多次,也就是最少1次", "?": { 1: "表示匹配前面緊接著的子表達(dá)式0次或1次,也就是最多1次", 2: "非貪婪模式:前提是緊跟在其他限定符后面,比如"*"、"+"、"{n,m}"等,表示盡可能少的匹配,比如"{n,m}",例如: "/d{4,6}?/g",假如使用這個(gè)正則test一段字符串"123456abc",則會(huì)盡可能少的匹配,也就是每次test只匹配4個(gè),然后lastIndex被置為4,默認(rèn)情況下為貪婪模式,每次會(huì)匹配6個(gè),lastIndex會(huì)重置為6,如果無(wú)法匹配6個(gè)才會(huì)嘗試匹配5個(gè),4個(gè)" }, "{n}": "表示匹配前面緊接著的子表達(dá)式n次,n為非負(fù)整數(shù)", "{n,}": "表示匹配前面緊接著的子表達(dá)式n次或更多次,也就是最少n次,n為非負(fù)整數(shù)", "{n,m}": "表示匹配前面緊接著的子表達(dá)式n次到m次,也就是最少匹配n次,最多匹配m次,n <= m 且n和m均為非負(fù)整數(shù)", ".": "除" "外的任意字符", "|": "或,例如"/a|bcd/"可以匹配"a"或者"bcd","/(a|b)cd/"可以匹配"acd"或者"bcd"", "-": "僅當(dāng)在"[]"中可以表示連接符,"/[a-z]/"、"/A-Z/"、"/0-9/"分別表示a到z、A到Z、0到9,其他時(shí)間就表示中劃線", "[]": "字符集合,表示中括號(hào)中的任意字符,比如"/[acb123ABC]/"表示匹配到"acb123ABC"中任意一個(gè)就可以", "()": "分組,和我們平常的加減運(yùn)算中的()差不多,可以理解為確定優(yōu)先級(jí)的意思,不過(guò)js正則中的()分組可以通過(guò)"$1 - $9"獲取匹配結(jié)果中,每一個(gè)分組對(duì)應(yīng)的匹配值,也就是"$1"也就是第一個(gè)分組的子表達(dá)式匹配成功的結(jié)果,例如:"abc123ef".replace(/(w)(d){3}/g,"$2$1"),例子中,匹配(一個(gè)字母)緊接著(一個(gè)數(shù)字)循環(huán)了三次,"$1"就是后面緊接著數(shù)字的一個(gè)字母,也就是"c","$2"就是一個(gè)數(shù)字,也就是"(d)"的最后一個(gè)匹配結(jié)果"3",因?yàn)閿?shù)字循環(huán)了三次,所以三個(gè)數(shù)字會(huì)被替換成"$1",而c會(huì)被替換成"$2",結(jié)果就是"ab3cef"", "(?:)": "和()差不多一個(gè)意思,只是()中的分組內(nèi)容不會(huì)被存儲(chǔ)到"$1 - $9"的集合中", "(?=)": "正向前瞻,也就是前面的表達(dá)式緊接著的表達(dá)式,要符合(?=)的=后面跟著的表達(dá)式,例如:"/[a-z](?=d)/",只會(huì)匹配后面緊接著數(shù)字的小寫(xiě)字母,但是數(shù)字并不會(huì)出現(xiàn)在匹配結(jié)果中且不會(huì)被存儲(chǔ)到"$1 - $9"的集合中", "(?!)": "負(fù)向前瞻,也就是前面的表達(dá)式緊接著的表達(dá)式,要符合(?!)的 != 后面跟著的表達(dá)式,例如:"/[a-z](?!d)/",只會(huì)匹配后面緊接著不是數(shù)字的小寫(xiě)字母,但是數(shù)字并不會(huì)出現(xiàn)在匹配結(jié)果中且不會(huì)被存儲(chǔ)到"$1 - $9"的集合中" }
基礎(chǔ)的運(yùn)算符和限定符無(wú)非就這幾個(gè),說(shuō)到運(yùn)算符就有優(yōu)先級(jí),上面的運(yùn)算符的優(yōu)先級(jí)為:
{ "一級(jí)": """", "二級(jí)": ""()"、"(?:)"、"(?=)"、"[]"", "三級(jí)": ""*"、"+"、"?"、"{n}"、"{n,}"、"{n,m}"", "四級(jí)": ""^"、"$"、"其他元字符及字符"", "五級(jí)": ""|"", }
語(yǔ)義類(lèi)元字符
{ "": "單詞邊界,也就是前面或者后面要跟著個(gè)空格", "B": "非單詞邊界,也就是必須在單詞中間,前后不能有空格", "d": "匹配一個(gè)數(shù)字字符,等價(jià)于"[0-9]"", "D": "匹配一個(gè)非數(shù)字字符,等價(jià)于"[^0-9]"", "w": "匹配任意單詞字符和下劃線"_",等價(jià)于"[a-zA-Z0-9_]"", "W": "匹配任意非單詞字符及非下劃線,等價(jià)于"[^a-zA-Z0-9_]"", "s": "匹配任意空白字符,含空格、制表符、換頁(yè)符等", "S": "匹配非空白字符", //···還有很多不常用的,用時(shí)再查吧 }
前一篇筆記只解析了RegExp對(duì)象的原型方法,但是對(duì)于正則表達(dá)式,一些字符串的方法同樣可以使用在正則上。
replacereplace也屬于經(jīng)常使用的一個(gè)方法,在具體到和正則表達(dá)式一起使用時(shí)是:stringObject.replace(RegExpObject,string|function),上例子:
var str1 = "2017-07-12"; var reg1 = /(d{4})-(d{2})-(d{2})/g; str1.replace(reg1, function(a,b,c,d,e){ // a/b/c/d/e分別代表: 匹配結(jié)果/第一個(gè)分組匹配值/第二個(gè)分組匹配值/第三個(gè)分組匹配值/匹配成功的第一個(gè)字符的index值 console.log(a,b,c,d); //2017-07-12 2017 07 12,0 return c + "/" + d + "/" + b; }) console.log(str1); //07/12/2017
需要注意的是,string是沒(méi)有replaceAll的方法的,需要全局替換請(qǐng)?jiān)谡谥性O(shè)置全局屬性g;
matchmath方法也是string的方法,match方法用法和exec很相似,同樣返回?cái)?shù)組。
非全局正則調(diào)用,輸出結(jié)果和exec相似,無(wú)匹配結(jié)果則返回null,有則返回?cái)?shù)組,分別存放每一個(gè)子表達(dá)式匹配的結(jié)果,同時(shí)具有index和input兩個(gè)屬性:
var reg1 = /([a-zA-Z]d)+([u4e00-u9fa5])+/; //匹配 (大小寫(xiě)字母連著一個(gè)數(shù)字) 至少一次 (再連著漢字) 至少一次 var str1 = "a11B2老cd3李e45好"; var result = str1.match(reg1); console.log(result); //["B2老", "B2", "老"]
這個(gè)結(jié)果和exec的結(jié)果完全一樣;
全局正則調(diào)用,數(shù)組只存放所有匹配的整個(gè)正則的子字符串,而不存放正則子表達(dá)式匹配的子字符串,也沒(méi)有index和input的屬性:
var reg2 = /([a-zA-Z]d)+([u4e00-u9fa5])+/g; //匹配 (大小寫(xiě)字母連著一個(gè)數(shù)字) 至少一次 (再連著漢字) 至少一次 var str2 = "a11B2老cd3李e45好"; var result1 = str2.match(reg2); var result2 = str2.match(reg2); var result3 = str2.match(reg2); console.log(result1,result2,result3); //["B2老", "d3李"] ["B2老", "d3李"] ["B2老", "d3李"] console.log(result1.index,result2.input,result3); //undefined undefined ["B2老", "d3李"] 執(zhí)行多次均只輸出每一個(gè)匹配完整正則的子字符串,同時(shí)也沒(méi)有index和input的屬性。search
search方法返回的就是正則第一次匹配成功的開(kāi)始位置,用法是stringObject.search(regexp);同時(shí)serch方法只需要匹配成功一次,不會(huì)重置laseIndex屬性,每次都從字符串起始位置開(kāi)始搜索,也會(huì)忽略全局搜索g:
var reg3 = /([a-zA-Z]d)+([u4e00-u9fa5])+/g; var reg4 = /([a-zA-Z]d)+([u4e00-u9fa5])+/g; var str3 = "a11B2老cd3李e45好"; str3.search(reg3); //3 str3.search(reg3); //3 str3.search(reg4); //3 str3.search(reg4); //3 多次搜索和是否全局均不會(huì)影響搜索結(jié)果
不管多么復(fù)雜的正則,都是用本節(jié)中的元字符寫(xiě)出來(lái)的,而在復(fù)雜的正則,用法無(wú)非也就上節(jié)和這一節(jié)中所記錄的方法。關(guān)鍵在于常用才能熟練,深入才能理解。這兩節(jié)筆記只是淺入,在實(shí)踐中摸索實(shí)踐才能真的深入淺出,一起加油。
淺入正則(一)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/87120.html
摘要:例在第行中,結(jié)果為,因?yàn)榈谒男兄械钠ヅ涑晒螅瑸椋簿褪窍乱淮问菑拈_(kāi)始匹配,所以匹配失敗,返回,并把置為淺入正則二字符的含義和使用 正則表達(dá)式一直作為我的痛點(diǎn),沒(méi)有系統(tǒng)的學(xué)習(xí)和了解,之前部門(mén)有本500多頁(yè)的書(shū)叫《精通正則表達(dá)式》,一直沒(méi)勇氣拿起來(lái)。到后來(lái)業(yè)務(wù)中需要正則的地方越來(lái)越多,不忍心老找人幫忙寫(xiě)正則了。找了資料先看著,至少自己先入個(gè)門(mén)。 with (javascript) 實(shí)例化...
摘要:因?yàn)橥粫r(shí)間,只能處理一個(gè)異步,這又牽扯到單線程問(wèn)題了。然后控制臺(tái)默默打印了個(gè)目前前端,異步主要為前后端交互以及定時(shí)器,僅僅說(shuō)前端,如果說(shuō)的話,還有文件讀取等其他的方面會(huì)異步。 此篇文章完全按照我個(gè)人理解去寫(xiě)。 1.何為JS 先說(shuō)說(shuō)js干啥的。不負(fù)責(zé)點(diǎn)說(shuō),js就是操作瀏覽器的。 有人可能說(shuō)nodeJS,nodeJS嚴(yán)格意義上只能說(shuō)是用的ES,因?yàn)樗麤](méi)有dom ,也沒(méi)有bom。 簡(jiǎn)單點(diǎn)說(shuō)...
摘要:一靜態(tài)屬性緩存部分由于每次正則替換費(fèi)時(shí),所以有個(gè)動(dòng)物函數(shù),框架使用靜態(tài)屬性保存,提高效率的意思是大駝峰式,這個(gè)函數(shù)是將轉(zhuǎn)換成的意思駱駝,這個(gè)函數(shù)是小駝峰格式,第一個(gè)字母是小寫(xiě)字母轉(zhuǎn)換成的意思是蛇,很形象,整個(gè)身子都一樣粗,它只對(duì)中有大寫(xiě) 一:靜態(tài)屬性緩存部分 由于每次正則替換費(fèi)時(shí),所以有4個(gè)動(dòng)物函數(shù),框架使用靜態(tài)屬性保存,提高效率 01:Str::studly($value)studl...
摘要:函數(shù)式編程,一看這個(gè)詞,簡(jiǎn)直就是學(xué)院派的典范。所以這期周刊,我們就重點(diǎn)引入的函數(shù)式編程,淺入淺出,一窺函數(shù)式編程的思想,可能讓你對(duì)編程語(yǔ)言的理解更加融會(huì)貫通一些。但從根本上來(lái)說(shuō),函數(shù)式編程就是關(guān)于如使用通用的可復(fù)用函數(shù)進(jìn)行組合編程。 showImg(https://segmentfault.com/img/bVGQuc); 函數(shù)式編程(Functional Programming),一...
閱讀 3081·2021-11-24 10:47
閱讀 3831·2021-11-02 14:43
閱讀 2228·2021-09-26 10:15
閱讀 2254·2021-09-08 09:35
閱讀 560·2019-08-30 12:45
閱讀 2781·2019-08-29 17:04
閱讀 3214·2019-08-26 14:05
閱讀 1259·2019-08-26 12:10