摘要:例在第行中,結(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í)例化RegExp對(duì)象實(shí)例化RegExp對(duì)象同實(shí)例化其他JavaScript內(nèi)置對(duì)象一樣,分別有字面量和構(gòu)造函數(shù)兩種方法:
var reg1 = /d/g; //全局匹配數(shù)字 var reg2 = new RegExp("D","g"); //全局匹配非數(shù)字RegExp對(duì)象原型方法
類(lèi)似Array/String/Function都有自己的原型方法,RexExp對(duì)象同樣有自己的原型方法。
test不管正則6不6,test方法一定都會(huì)用:RegExpObject.test(string); string中是否含有RegExpObject中匹配的字符串片段,有則返回true,否則返回false
/d/g.test("abc"); //false /d/g.test("123"); //trueexec
這個(gè)方法很強(qiáng)大,但是理解起來(lái)有點(diǎn)難,簡(jiǎn)單說(shuō),用法是:RegExpObject.exec(string);這個(gè)和test一樣,返回值是返回一個(gè)數(shù)組或者null,也就是說(shuō)RegExpObject在string中成功匹配到了字符串片段,則返回一個(gè)數(shù)組,這個(gè)數(shù)組各項(xiàng)分別是:
[ 0: "與正則表達(dá)式匹配的文本", 1: "與正則表達(dá)式第一個(gè)分組匹配的文本", //分組就先理解為一個(gè)括號(hào)為一個(gè)分組 2:" 與正則表達(dá)式第二個(gè)分組匹配的文本", 3: "···以此類(lèi)推" ] //來(lái)個(gè)例子: var reg1 = /([a-zA-Z]d)+([u4e00-u9fa5])+/; //匹配 (大小寫(xiě)字母連著一個(gè)數(shù)字) 至少一次 (再連著漢字) 至少一次 var str1 = "a11B2老cd3李e45好"; var result = reg1.exec(str1); console.log(result); //["B2老", "B2", "老"]
例子中正則匹配數(shù)字的結(jié)果是"B2老";所以結(jié)果數(shù)組中第一個(gè)元素為"B2老",第一個(gè)分組是(大小寫(xiě)字母連著一個(gè)數(shù)字),第二個(gè)元素就是"B2",第二個(gè)分組是漢字,第三個(gè)元素就是"老"。同時(shí),這里有幾個(gè)重點(diǎn)要?jiǎng)潱?/p>
返回結(jié)果的數(shù)組自帶另外兩個(gè)屬性:index:匹配成功字符串片段的起始index; input:存放被檢測(cè)的字符串,也就是例子中的str1;
如果整個(gè)正則沒(méi)有匹配結(jié)果,僅僅其中某個(gè)分組有匹配結(jié)果,則exec的返回值為null。所以test方法也可以使用RegExpObject.exec(string) != null;來(lái)替代;
如果其中某個(gè)分組有多個(gè)匹配結(jié)果,例如:我們str1改"a1B2老cd3李e45好";那么 (大小寫(xiě)字母連著一個(gè)數(shù)字) 這個(gè)分組就有多個(gè)匹配結(jié)果,a1和B2;那么返回到數(shù)組中的是最后一個(gè)匹配成功的結(jié)果,也就是B2;
如果正則是一個(gè)全局的正則表達(dá)式(global);那么返回值數(shù)組會(huì)首先取第一段匹配成功的結(jié)果輸出,然后第二次執(zhí)行會(huì)取第二段,依次循環(huán)類(lèi)推,例如:
var reg2 = /([a-zA-Z]d)+([u4e00-u9fa5])+/g; //匹配 (大小寫(xiě)字母連著一個(gè)數(shù)字) 至少一次 (再連著漢字) 至少一次 var str2 = "a11B2老cd3李e45好"; var result1 = reg2.exec(str2); var result2 = reg2.exec(str2); var result3 = reg2.exec(str2); console.log(result1,result2,result3); //輸出: ["B2老", "B2", "老"] //index: 3 ["d3李", "d3", "李"] //index: 7 nulltoString
方法同Object的toString方法;將RegExp對(duì)象轉(zhuǎn)為字符串。
var reg3 = /d/g; var reg4 = new RegExp("d","g"); reg3.toString(); //"/d/g" reg4.toString(); //"/d/g"RegExp對(duì)象屬性
global: 只讀,簡(jiǎn)寫(xiě)g;被設(shè)置則表示全局搜索,即在字符串中查找到所有匹配條件的字符串片段,不設(shè)置的話匹配到第一個(gè)成功的即停止;
ignoreCase: 只讀,簡(jiǎn)寫(xiě)i;不區(qū)分大小寫(xiě);
multiline: 只讀,簡(jiǎn)寫(xiě)m;多行匹配,字符串中帶有換行符時(shí),如果不設(shè)置i屬性,則只匹配第一行,設(shè)置后所有行均匹配且每行的開(kāi)頭/結(jié)尾可以作為開(kāi)頭/結(jié)尾被匹配(^/$);
source: 只讀,返回正則表達(dá)式的文本,簡(jiǎn)單說(shuō),上例中的正則表達(dá)式/([a-zA-Z]d)+([u4e00-u9fa5])+/gim,去掉兩邊的斜杠和斜杠外的東西//gim,結(jié)果就是([a-zA-Z]d)+([u4e00-u9fa5])+;
lastIndex: 讀寫(xiě),在全局正則表達(dá)式的前提下,上一次匹配成功的文本片段的最后一個(gè)字符之后一個(gè)文本的位置,也是下一次匹配的起始位置,初始為0,無(wú)匹配結(jié)果時(shí)置為0。例:
var reg5 = /d/g; var str5 = "a1bc2e3fj"; console.log(reg5.lastIndex); //0 console.log(reg5.test(str5), reg5.lastIndex); //true 2 console.log(reg5.test(str5), reg5.lastIndex); //true 5 console.log(reg5.test(str5), reg5.lastIndex); //true 7 console.log(reg5.test(str5), reg5.lastIndex); //false 0 console.log(reg5.test(str5), reg5.lastIndex); //true 2 console.log(reg5.test(str5), reg5.lastIndex); //true 5
在第5行中,結(jié)果為false,因?yàn)榈谒男兄械钠ヅ涑晒?,lastIndex為7,也就是下一次是從f開(kāi)始匹配,所以匹配失敗,返回false,并把lastIndex置為0
淺入正則(二):字符的含義和使用
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/83868.html
摘要:前一篇淺入正則一了解了實(shí)例化一個(gè)對(duì)象的原型方法的對(duì)象屬性這些基礎(chǔ),大致知道正則怎么用,這一篇主要想了解一下正則怎么寫(xiě)。 with (javascript) 前一篇淺入正則(一)了解了實(shí)例化一個(gè)RegExp對(duì)象、RegExp的原型方法、RegExp的對(duì)象屬性這些基礎(chǔ),大致知道正則怎么用,這一篇主要想了解一下正則怎么寫(xiě)。 元字符 元字符表隨便就查得到,但這是會(huì)寫(xiě)正則最重要的基礎(chǔ),這里簡(jiǎn)單分...
摘要:因?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...
摘要:前言寫(xiě)這篇文章不是空穴來(lái)風(fēng),最近一個(gè)禮拜寫(xiě)了一個(gè)簡(jiǎn)單的腳本,用來(lái)處理上千個(gè)文件,以便于在某些特定字符的周?chē)砑訕?biāo)記,先說(shuō)一下我這個(gè)腳本使用場(chǎng)景主要是來(lái)識(shí)別中文具體做什么,之后會(huì)單獨(dú)寫(xiě)一篇文章,此處只提該腳本作用,同時(shí)為不同的文件類(lèi)型,包括, 前言 寫(xiě)這篇文章不是空穴來(lái)風(fēng),最近一個(gè)禮拜寫(xiě)了一個(gè)簡(jiǎn)單的nodejs腳本,用來(lái)處理上千個(gè)文件,以便于在某些特定字符的周?chē)砑訕?biāo)記,先說(shuō)一下我這個(gè)腳...
摘要:也就是說(shuō)通過(guò)我們自己構(gòu)建來(lái)解釋是否是一個(gè)合適的路由抽象。首先,并不需要,因?yàn)槿绻酚芍袥](méi)有給那么將會(huì)自動(dòng)渲染?;旧衔覀兊穆酚芍灰P(guān)心的變化并且返回相應(yīng)的即可。為了解決這個(gè)問(wèn)題,需要跟蹤每一條并且當(dāng)路由發(fā)生改變的時(shí)候調(diào)用。 showImg(https://segmentfault.com/img/remote/1460000008803951?w=800&h=615); 作者:Tyl...
閱讀 2273·2023-04-25 14:50
閱讀 1273·2021-10-13 09:50
閱讀 1874·2019-08-30 15:56
閱讀 1853·2019-08-29 15:29
閱讀 2892·2019-08-29 15:27
閱讀 3569·2019-08-29 15:14
閱讀 1206·2019-08-29 13:01
閱讀 3307·2019-08-26 14:06