摘要:如果傳入的字符串與正則表達式匹配,返回,反之返回。根據正則表達式里面是否有,的行為有較大差異。六方法的參數可以是一個正則表達式,也可以是一個字符方法按照給定的正則表達式或者字符分割字符串,返回一個包含分割后的子串的數組。
與正則表達式相關的API有以下7個:
RegExp.prototype?.test()
RegExp.prototype?.exec()
String?.prototype?.search()
String?.prototype?.match()
String?.prototype?.matchAll()
String?.prototype?.split()
String?.prototype?.replace()
在我們展開到各個方法之前,先來看一下在JavaScript里面定義一個正則表達式的兩種方式:
1:字面量
let reg = /d[a-z]/ig;
2:new一個RegExp()對象
let reg = new RegExp(/d[a-z]/, "ig");
上面的2種方式定義的正則表達式,對于我們接下來要講的6個方法都是適用的。
一:RegExp.prototype?.test()
test()的參數是一個字符串,返回結果為布爾值。如果傳入的字符串與正則表達式匹配,返回true,反之返回false。
let reg = new RegExp(/d[a-z]/, "ig"); reg.test("1a"); // true reg.test("a1"); //false
二:RegExp.prototype?.exec()
exec()接受一個字符串為參數,如果有匹配的,返回一個數組,如果沒有匹配則返回null。根據正則表達式里面是否有"g",exec()的行為有較大差異。接下來我們都討論都是假設有匹配的情況:
1: 如果無"g",則返回一個數組,包含第一個匹配到的子串,更新index,但是不再繼續匹配
2: 如果有"g",
1: 第一次執行exec(),則返回包含第一個匹配到的子串,更新index; 2: 等下一次再執行exec()時候,從index的位置開始繼續匹配。 3: 如果沒有可再匹配的,則返回null,把index設置為0
看到這里,可能有人會疑惑,為什么上面會提到下一次再執行exec()。因為,在有"g"的情況下,假如我給定的字符串有2處匹配,但是執行一次exec()其實只會得到一個匹配的子串,并不會一次性就把所有能匹配到的子串返回。所以,你得多次調用exec(),才能保證得到所有可匹配的子串。接下來我們就用代碼來說明一下:
let str = "can you open a can?"; let regexp = /can/ig; let result = regexp.exec(str); console.log(result);
我們得到結果:
["can", index: 0, input: "can you open a can?", groups: undefined]
意識里,我們可能以為會得到兩個匹配(一個開頭的"can"和句子結尾的"can"),但是事實是,哪怕是有"g"的情況下,你每調用一次exec()只會得到一個匹配結果。如果想到得到所有的匹配結果,我們就得循環調用exec():
let str = "can you open a can?"; let regexp = /can/ig; let result; while (result = regexp.exec(str)) { console.log(result) }
我們得到結果:
["can", index: 0, input: "can you open a can?", groups: undefined] ["can", index: 15, input: "can you open a can?", groups: undefined]
三:String?.prototype?.search()
search()參數為一個正則表達式,返回值為第一個匹配的index,如果沒有任何匹配,則返回-1
let str = "can you open a can?"; let regexp = /can/ig; let regexp2 = /abc/ig; console.log(str.search(regexp)); // 0 console.log(str.search(regexp2)); // -1
關于search()需要記住的是:它只返回第一個匹配的index,一旦找到就會停止搜索,不會再繼續查找。
四:String?.prototype?.match()
match()方法也是會根據正則表達式是否帶有"g"而表現得不同,我們可以先看一段代碼對比一下:
let str = "Can you open a can"; let result = str.match( /can/i ); let result2 = str.match(/can/ig); let result3 = str.match(/abc/ig); console.log( result );//["Can", index: 0, input: "Can you open a can", groups: undefined] console.log( result2 );//?["Can", "can"] console.log( result3 );//null
我們從以上的result,result2,result3的結果可以得出match()的行為為
1: 當沒有"g"時,會以數組的形式返回第一個匹配的子串,以及一些附加信息 2: 當有"g"時,會以數組的形式返回所有匹配的子串,但是沒有附加信息 3: 如果沒有匹配的子串,返回null
關于match()完整地行為,需要結合著匹配組的知識一起看:正則表達式捕獲組
五:String.prototype.matchAll()
matchAll()還特別新,并不是所有的瀏覽器都支持了,這里先暫時不討論。以后再來補充。
六:String?.prototype?.split()
split()方法的參數可以是一個正則表達式,也可以是一個字符;split()方法按照給定的正則表達式或者字符分割字符串,返回一個包含分割后的子串的數組。
let str = "Can-you-open-a-can"; console.log(str.split(/-/)); //["Can", "you", "open", "a", "can"]
七:String?.prototype?.replace()
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/104028.html
摘要:正則表達式等待匹配的字符這里可以輸入任何繼承了的類返回一個值說明是否匹配這里需要注意的是,和均不允許通過構造器新建一個對象。 前言 之前一直想要做一個自己的爬蟲,然后從nba數據相關的網上【虎撲,騰訊,官網等,要視網站是否支持】爬點數據寫數據分析和圖形化展示。雖然年輕的時候就實現過這個功能,但是當時直接借用了一個網上現成的jar包,然后在那個基礎上寫了一個非常簡陋的正則表達式來提取數據...
摘要:介紹這周開始學習老姚大佬的正則表達式迷你書,然后習慣性的看完一遍后,整理一下知識點,便于以后自己重新復習。感謝原書作者老姚,本文無意抄襲,只是作為自己知識點的整理,后續也會整理到自己的知識庫網站中。等價于,表示出現次。 showImg(https://segmentfault.com/img/remote/1460000018530584?w=919&h=449); 介紹 這周開始學習...
閱讀 1588·2019-08-30 13:18
閱讀 1578·2019-08-29 12:19
閱讀 2094·2019-08-26 13:57
閱讀 4137·2019-08-26 13:22
閱讀 1179·2019-08-26 10:35
閱讀 2991·2019-08-23 18:09
閱讀 2500·2019-08-23 17:19
閱讀 677·2019-08-23 17:18