緊接:"理清JavaScript正則表達式--上篇"。 類String支持四種利用正則表達式的方法。分別是search、replace、match和split方法。下麵將一一講述。 --String.search(regexp)-- search相對於其他三個方法,是應用正則最簡單的方法啦,作用就是 ...
正則在String類中的應用 |
類String支持四種利用正則表達式的方法。分別是search、replace、match和split方法。下麵將一一講述。
--String.search(regexp)--
search相對於其他三個方法,是應用正則最簡單的方法啦,作用就是根據參數regexp查找相應匹配模式。
具體如下:
方法search中的參數為正則表達式對象,倘若我們賦予的值不是正則表達式對象,而是字元串,那麼search在內部首先得將傳入的字元串轉換成正則表達式對象,然後再給予匹配。匹配始終從字元串的初始位置開始,當找到第一個與正則表達式相匹配的字元時,就停止匹配,並返回匹配到的子串的起始位置。如果沒有找到就返回-1。
註意:search找到第一個匹配結果後,就停止,並不會繼續查找,so,標誌g對它無效!
Demo如下:
--String.split(delimiter, limit)--
方法split,根據傳入的delimiter參數,分割字元串,並返回一個分割後的字元串數組。
例如:
指定的分隔符delimiter,可以是字元串,也可以是正則表達式。如上所示。
咦,不是還有一個參數limit嗎?它的作用為啥子呢?
這個可選參數limit,為整數,限定返回數組的最大長度。如下:
--String.replace(match, replacement)--
replace方法的作用為:根據match指定的規則,查找字元串,如果找到匹配結果,就用第二個參數replacement去替換。倘若match為regexp對象,並指定了全局搜索標誌g,那麼將對全局查找替換,而不是在找到第一個匹配後,就停止操作。
So,參數match可以是RegExp對象,也可以是字元串,但是字元串因為沒有規定全局搜索標誌,所以如果match為字元串,那麼當找到第一個匹配替換後,就停止查找。
例如:
你以為replace方法就這麼結束了?No,No,No。
還記得在"理清"JavaScript正則表達式--上篇"中提到的括弧()的作用麽?
括弧可以將需要在後續使用的內容,作為子表達式括起來,在正則表達式中可以利用反斜杠\加數字,對前面的子表達式引用。replace方法也有這麼一功能,當然前提是參數match為RegExp對象,它是使用美元符$加相應的數字來引用,數字計算規則不變。
如下:
另,replace的第二個參數replacement不僅可以為字元串,還可以是函數哦。當字元串中與參數match匹配成功後,就調用這個replacement回調函數。
如我想將字元串中的所有單詞的第一個字母都大寫,那麼利用replacement函數可以這樣:
是不是很屌。
我們再細看看,這個回調函數的參數都有哪些,如下:
第一個參數就是匹配字元串,如上面的demo;
第二個參數是正則表達式中的子表達式(括弧啦),沒有子表達式,則沒有該參數
第三個參數是整數,聲明瞭匹配項出現在字元串中的位置;
第四個參數則是原字元串
--String.match(regexp)--
match方法返回與regexp相匹配結果的數組。參數regexp為RegExp對象,如果傳入的參數不為RegExp對象,則match內部首先將其轉換成RegExp對象。
註意:match方法返回的數組,與傳入的參數regexp帶不帶全局搜索標誌g,區別是非常大的。下麵將進行說明。
1、 如果regexp不帶標誌g,那麼match方法根據參數regexp匹配到首個子串後,就將停止繼續往下查找匹配;如果一個匹配也沒找到就返回null。
如下:
你以為就這麼結束了麽?No,No,No。
強大之處在於:如果你正則表達式中有子表達式(括弧啦),那麼返回的數組arr中,還包括這些與子表達式匹配的結果哦。arr[0]為匹配的文本,arr[1]為匹配的第一個子表達式,如此類推。
如下:
2、 如果regexp帶有執行全局搜索標誌g,那麼match方法將返回所有與參數regexp匹配的所有結果的數組。
如下:
RegExp對象中exec和test方法 |
RegExp對象定義了兩個用於執行模式匹配操作的方法:exec和test。下麵將一一講述。
--RegExp.exec(string)--
exec方法檢索參數string,當有匹配結果時,返回一個數組。沒有找到匹配結果時,則返回null。exec方法的調用分為兩種:
1、 當RegExp中沒有全局搜索標誌g時,那麼返回結果和String.match方法一樣:返回的數組arr中,arr[0]為匹配的文本,如果有子表達式,那麼arr[1]…就表示這些子表達式。並且將lastIndex置為0。註:lastIndex為RegExp對象的屬性。
如下:
2、 當RegExp中有全局搜索標誌g時,那麼返回的結果還是和String.match一樣。咦,什麼套路?
不過,區別在於它會將RegExp對象的屬性lastIndex置為緊接著上次找到匹配文本的字元位置,而不是為0。
如下:
那這點不同有什麼用呢?
那就得看看lastIndex的作用咯。每次當,利用exec或者test方法檢索字元串時,他們都是從lastIndex的位置為起點向後檢索。
如下:
所以,當RegExp中有全局搜索標誌g時,它將lastIndex置為緊接著上次找到匹配文本的字元位置,那麼我們就可以迴圈檢索字元串了。
如下:
--RegExp.test(string)--
test方法檢測參數string字元串,是否含有匹配文本,如果有,則返回true,否則為false。RegExp中帶沒帶全局搜索標誌g的區別在於,對象的屬性lastIndex。如果不帶g,則lastIndex為0,否則將lastIndex置為緊接著上次找到匹配文本的字元位置。
如下:
好了,梳理JavaScipt中的正則表達式就到此結束啦~