摘要:例在第行中,結果為,因為第四行中的匹配成功后,為,也就是下一次是從開始匹配,所以匹配失敗,返回,并把置為淺入正則二字符的含義和使用
正則表達式一直作為我的痛點,沒有系統的學習和了解,之前部門有本500多頁的書叫《精通正則表達式》,一直沒勇氣拿起來。到后來業務中需要正則的地方越來越多,不忍心老找人幫忙寫正則了。找了資料先看著,至少自己先入個門。
with (javascript)
實例化RegExp對象實例化RegExp對象同實例化其他JavaScript內置對象一樣,分別有字面量和構造函數兩種方法:
var reg1 = /d/g; //全局匹配數字 var reg2 = new RegExp("D","g"); //全局匹配非數字RegExp對象原型方法
類似Array/String/Function都有自己的原型方法,RexExp對象同樣有自己的原型方法。
test不管正則6不6,test方法一定都會用:RegExpObject.test(string); string中是否含有RegExpObject中匹配的字符串片段,有則返回true,否則返回false
/d/g.test("abc"); //false /d/g.test("123"); //trueexec
這個方法很強大,但是理解起來有點難,簡單說,用法是:RegExpObject.exec(string);這個和test一樣,返回值是返回一個數組或者null,也就是說RegExpObject在string中成功匹配到了字符串片段,則返回一個數組,這個數組各項分別是:
[ 0: "與正則表達式匹配的文本", 1: "與正則表達式第一個分組匹配的文本", //分組就先理解為一個括號為一個分組 2:" 與正則表達式第二個分組匹配的文本", 3: "···以此類推" ] //來個例子: var reg1 = /([a-zA-Z]d)+([u4e00-u9fa5])+/; //匹配 (大小寫字母連著一個數字) 至少一次 (再連著漢字) 至少一次 var str1 = "a11B2老cd3李e45好"; var result = reg1.exec(str1); console.log(result); //["B2老", "B2", "老"]
例子中正則匹配數字的結果是"B2老";所以結果數組中第一個元素為"B2老",第一個分組是(大小寫字母連著一個數字),第二個元素就是"B2",第二個分組是漢字,第三個元素就是"老"。同時,這里有幾個重點要劃:
返回結果的數組自帶另外兩個屬性:index:匹配成功字符串片段的起始index; input:存放被檢測的字符串,也就是例子中的str1;
如果整個正則沒有匹配結果,僅僅其中某個分組有匹配結果,則exec的返回值為null。所以test方法也可以使用RegExpObject.exec(string) != null;來替代;
如果其中某個分組有多個匹配結果,例如:我們str1改"a1B2老cd3李e45好";那么 (大小寫字母連著一個數字) 這個分組就有多個匹配結果,a1和B2;那么返回到數組中的是最后一個匹配成功的結果,也就是B2;
如果正則是一個全局的正則表達式(global);那么返回值數組會首先取第一段匹配成功的結果輸出,然后第二次執行會取第二段,依次循環類推,例如:
var reg2 = /([a-zA-Z]d)+([u4e00-u9fa5])+/g; //匹配 (大小寫字母連著一個數字) 至少一次 (再連著漢字) 至少一次 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對象轉為字符串。
var reg3 = /d/g; var reg4 = new RegExp("d","g"); reg3.toString(); //"/d/g" reg4.toString(); //"/d/g"RegExp對象屬性
global: 只讀,簡寫g;被設置則表示全局搜索,即在字符串中查找到所有匹配條件的字符串片段,不設置的話匹配到第一個成功的即停止;
ignoreCase: 只讀,簡寫i;不區分大小寫;
multiline: 只讀,簡寫m;多行匹配,字符串中帶有換行符時,如果不設置i屬性,則只匹配第一行,設置后所有行均匹配且每行的開頭/結尾可以作為開頭/結尾被匹配(^/$);
source: 只讀,返回正則表達式的文本,簡單說,上例中的正則表達式/([a-zA-Z]d)+([u4e00-u9fa5])+/gim,去掉兩邊的斜杠和斜杠外的東西//gim,結果就是([a-zA-Z]d)+([u4e00-u9fa5])+;
lastIndex: 讀寫,在全局正則表達式的前提下,上一次匹配成功的文本片段的最后一個字符之后一個文本的位置,也是下一次匹配的起始位置,初始為0,無匹配結果時置為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行中,結果為false,因為第四行中的匹配成功后,lastIndex為7,也就是下一次是從f開始匹配,所以匹配失敗,返回false,并把lastIndex置為0
淺入正則(二):字符的含義和使用
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83868.html
摘要:因為同一時間,只能處理一個異步,這又牽扯到單線程問題了。然后控制臺默默打印了個目前前端,異步主要為前后端交互以及定時器,僅僅說前端,如果說的話,還有文件讀取等其他的方面會異步。 此篇文章完全按照我個人理解去寫。 1.何為JS 先說說js干啥的。不負責點說,js就是操作瀏覽器的。 有人可能說nodeJS,nodeJS嚴格意義上只能說是用的ES,因為他沒有dom ,也沒有bom。 簡單點說...
摘要:一靜態屬性緩存部分由于每次正則替換費時,所以有個動物函數,框架使用靜態屬性保存,提高效率的意思是大駝峰式,這個函數是將轉換成的意思駱駝,這個函數是小駝峰格式,第一個字母是小寫字母轉換成的意思是蛇,很形象,整個身子都一樣粗,它只對中有大寫 一:靜態屬性緩存部分 由于每次正則替換費時,所以有4個動物函數,框架使用靜態屬性保存,提高效率 01:Str::studly($value)studl...
摘要:前言寫這篇文章不是空穴來風,最近一個禮拜寫了一個簡單的腳本,用來處理上千個文件,以便于在某些特定字符的周圍添加標記,先說一下我這個腳本使用場景主要是來識別中文具體做什么,之后會單獨寫一篇文章,此處只提該腳本作用,同時為不同的文件類型,包括, 前言 寫這篇文章不是空穴來風,最近一個禮拜寫了一個簡單的nodejs腳本,用來處理上千個文件,以便于在某些特定字符的周圍添加標記,先說一下我這個腳...
摘要:也就是說通過我們自己構建來解釋是否是一個合適的路由抽象。首先,并不需要,因為如果路由中沒有給那么將會自動渲染。基本上我們的路由只要關心的變化并且返回相應的即可。為了解決這個問題,需要跟蹤每一條并且當路由發生改變的時候調用。 showImg(https://segmentfault.com/img/remote/1460000008803951?w=800&h=615); 作者:Tyl...
閱讀 2260·2023-04-25 14:50
閱讀 1234·2021-10-13 09:50
閱讀 1866·2019-08-30 15:56
閱讀 1840·2019-08-29 15:29
閱讀 2887·2019-08-29 15:27
閱讀 3548·2019-08-29 15:14
閱讀 1192·2019-08-29 13:01
閱讀 3299·2019-08-26 14:06