JavaScript RegExp 物件
什麼是 RegExp?
正規(guī)表示式描述了字元的模式物件。
當(dāng)您檢索某個(gè)文字時(shí),可以使用一種模式來(lái)描述要檢索的內(nèi)容。 RegExp 就是這種模式。
簡(jiǎn)單的模式可以是一個(gè)單獨(dú)的字元。
更複雜的模式包括了更多的字符,並可用於解析、格式檢查、替換等等。
您可以規(guī)定字串中的檢索位置,以及要檢索的字元類型,等等。
JavaScript提供了一個(gè)RegExp物件來(lái)完成有關(guān)正規(guī)表示式的操作和功能,每個(gè)正規(guī)表示式模式對(duì)應(yīng)一個(gè)RegExp實(shí)例
#有兩種方式可以建立RegExp物件的實(shí)例。?
使用RegExp的明確建構(gòu)函數(shù),語(yǔ)法為:new RegExp("pattern"[,"flags"])。?
使用RegExp的隱式建構(gòu)函數(shù),採(cǎi)用純文字格式:/pattern/[flags]。?
pattern部分為要使用的正規(guī)表示式模式文本,是必須的。在第一種方式中,pattern部分以JavaScript字串的形式存在,需要使用雙引號(hào)或單引號(hào)括起來(lái);在第二種方式中,pattern部分嵌套在兩個(gè)「/」之間,不能使用引號(hào)。?
flags部分設(shè)定正規(guī)表示式的標(biāo)誌訊息,是可選項(xiàng)。如果設(shè)定flags部分,在第一種方式中,以字串的形式存在;在第二種方式中,以文字的形式緊接在最後一個(gè)「/」字元之後。 flags可以是以下標(biāo)誌字元的組合。?
g是全域標(biāo)誌。如果設(shè)定了這個(gè)標(biāo)誌,對(duì)某個(gè)文字執(zhí)行搜尋和取代操作時(shí),將對(duì)文字中所有符合的部分起作用。如果不設(shè)定這個(gè)標(biāo)誌,則僅搜尋和取代最早匹配的內(nèi)容。?
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文網(wǎng)(php.cn)</title> <script type="text/javascript"> var myString="這是第一個(gè)正則表達(dá)式的例子"; var myregex = new RegExp("一個(gè)"); // 創(chuàng)建正則表達(dá)式 if (myregex.test(myString)){ document.write("找到了指定的模式!"); } else{ document.write("未找到指定的模式。"); } </script> </head> <body> </body> </html>
RegExp 修飾符
g?是全域標(biāo)誌。如果設(shè)定了這個(gè)標(biāo)誌,對(duì)某個(gè)文字執(zhí)行搜尋和取代操作時(shí),將對(duì)文字中所有符合的部分起作用。如果不設(shè)定這個(gè)標(biāo)誌,則僅搜尋和取代最早匹配的內(nèi)容。?
i 是忽略大小寫標(biāo)誌。如果設(shè)定了這個(gè)標(biāo)誌,進(jìn)行配對(duì)比較時(shí),將忽略大小寫。?
m 是多行標(biāo)誌。如果不設(shè)定這個(gè)標(biāo)誌,那麼元字元「^」只與整個(gè)被搜尋字串的起始位置相匹配,而元字元「$」只與被搜尋字串的結(jié)束位置相符。如果設(shè)定了這個(gè)標(biāo)誌,「^」也可以與被搜尋字串中的「\n」或「\r」之後的位置(即下一行的行首)相匹配,而「$」也可以與被搜尋字串中的“\n”或“\r”之後的位置(即下一行的行尾)相符。?
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文網(wǎng)(php.cn)</title> </head> <body> <script> var str="Is this all there is?"; var patt1=/is/gi; document.write(str.match(patt1)); </script> </body> </html>
RegExp物件的屬性
RegExp物件的屬性分為靜態(tài)屬性和實(shí)例屬性。
1 靜態(tài)屬性?
(1)index屬性。是目前表達(dá)式模式首次符合內(nèi)容的開(kāi)始位置,從0開(kāi)始計(jì)數(shù)。其初始值為-1,每次成功匹配時(shí),index屬性都會(huì)隨之改變。?
(2)input屬性。傳回目前所作用的字串,可以簡(jiǎn)寫為$_,初始值為空字串""。?
(3)lastIndex屬性。是當(dāng)前表達(dá)式模式首次匹配內(nèi)容中最後一個(gè)字元的下一個(gè)位置,從0開(kāi)始計(jì)數(shù),常被作為繼續(xù)搜索時(shí)的起始位置,初始值為-1,表示從起始位置開(kāi)始搜索,每次成功匹配時(shí),lastIndex屬性值都會(huì)隨之改變。?
(4)lastMatch屬性。是目前表達(dá)式模式的最後一個(gè)符合字串,可以簡(jiǎn)寫為$&。其初始值為空字串""。在每次成功配對(duì)時(shí),lastMatch屬性值都會(huì)隨之改變。?
(5)lastParen屬性。如果表達(dá)式模式中有括起來(lái)的子匹配,是當(dāng)前表達(dá)式模式中最後的子匹配所匹配到的子字串,可以簡(jiǎn)寫為$+。其初始值為空字串""。每次成功配對(duì)時(shí),lastParen屬性值都會(huì)隨之改變。?
(6)leftContext屬性。是目前表達(dá)式模式最後一個(gè)符合字串左邊的所有內(nèi)容,可以簡(jiǎn)寫為$`(其中「'」為鍵盤上「Esc」下邊的反單引號(hào))。初始值為空字串""。每次成功匹配時(shí),其屬性值都會(huì)隨之改變。?
(7)rightContext屬性。是目前表達(dá)式模式最後一個(gè)符合字串右邊的所有內(nèi)容,可以簡(jiǎn)寫為$'。初始值為空字串""。每次成功匹配時(shí),其屬性值都會(huì)隨之改變。?
(8)$1…$9屬性。這些屬性是唯讀的。如果表達(dá)式模式中有括起來(lái)的子匹配,$1…$9屬性值分別是第1個(gè)到第9個(gè)子匹配所捕捉到的內(nèi)容。如果有超過(guò)9個(gè)以上的子匹配,$1…$9屬性分別對(duì)應(yīng)最後的9個(gè)子匹配。在一個(gè)表達(dá)式模式中,可以指定任意多個(gè)括號(hào)的子匹配,但RegExp物件只能儲(chǔ)存最後的9個(gè)子匹配的結(jié)果。在RegExp實(shí)例物件的一些方法所傳回的結(jié)果陣列中,可以得到所有圓括號(hào)內(nèi)的子符合結(jié)果。
2 實(shí)例屬性?
(1)global屬性。傳回建立RegExp物件實(shí)例時(shí)指定的global標(biāo)誌(g)的狀態(tài)。如果在建立RegExp物件實(shí)例時(shí)設(shè)定了g標(biāo)誌,則該屬性傳回True,否則傳回False,預(yù)設(shè)值為False。?
(2)ignoreCase屬性。傳回建立RegExp物件實(shí)例時(shí)指定的ignoreCase標(biāo)誌(i)的狀態(tài)。如果在建立RegExp物件實(shí)例時(shí)設(shè)定了i標(biāo)誌,則該屬性傳回True,否則傳回False,預(yù)設(shè)值為False。?
(3)multiLine屬性。傳回建立RegExp物件實(shí)例時(shí)指定的multiLine標(biāo)誌(m)的狀態(tài)。如果在建立RegExp物件實(shí)例時(shí)設(shè)定了m標(biāo)誌,則該屬性傳回True,否則傳回False,預(yù)設(shè)值為False。?
(4)source屬性。傳回建立RegExp物件實(shí)例時(shí)指定的表達(dá)式文字字串。?
RegExp物件的方法
1 test方法?
語(yǔ)法格式為test(str)。此方法檢查字串中是否存在建立RegExp物件實(shí)例時(shí)所指定的表達(dá)式模式,如果存在就傳回True,否則傳回False。如果找到符合項(xiàng),則會(huì)更新RegExp物件中的相關(guān)靜態(tài)屬性,以反映符合情況。?
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文網(wǎng)(php.cn)</title> </head> <body> <script> var str = 'php'; var patt1 = new RegExp('\w', 'g'); // 有轉(zhuǎn)義作為正則表達(dá)式處理 var patt2 = new RegExp('\w', 'g'); // 無(wú)轉(zhuǎn)義作為字符串處理 var patt3 =/\w+/g; // 與 patt1 效果相同 document.write(patt1.test(str)) //輸出 true document.write("<br>") document.write(patt2.test(str)) //輸出 false document.write("<br>") document.write(patt3.test(str)) //輸出 true </script> </body> </html>
2 exec方法?
語(yǔ)法格式為exec(str)。此方法使用建立RegExp物件實(shí)例時(shí)所指定的表達(dá)式模式對(duì)一個(gè)字串進(jìn)行搜索,並傳回一個(gè)包含搜尋結(jié)果的陣列。
如果為正規(guī)表示式設(shè)定了全域標(biāo)誌(g),可以透過(guò)多次呼叫exec和test方法在字串中進(jìn)行連續(xù)搜索,每次都是從RegExp物件的lastIndex屬性值指定的位置開(kāi)始搜尋字元串。?
如果沒(méi)有設(shè)定全域標(biāo)誌(g),則exec和test方法忽略RegExp物件的lastIndex屬性值,從字串的起始位置開(kāi)始搜尋。?
如果exec方法沒(méi)有找到匹配,則傳回值為null;如果找到匹配,則傳回一個(gè)數(shù)組,並更新RegExp物件中有關(guān)靜態(tài)屬性以反映匹配情況。傳回?cái)?shù)組中的元素0包含了完整的匹配結(jié)果,而元素1~n依序是表達(dá)式模式中定義的各個(gè)子匹配的結(jié)果。?
exec方法回傳的陣列有3個(gè)屬性,分別是input、index和lastIndex。?
input屬性是整個(gè)被搜尋的字串。?
index屬性是指符合在整個(gè)被搜尋字串中的位置。?
lastIndex屬性是指匹配的子字串的最後一個(gè)字元的下一個(gè)字元位置。?
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文網(wǎng)(php.cn)</title> <script type="text/javascript"> var myString="aaa 111 bbb 222 ccc 1111 222ddd"; var regex = /111/; //創(chuàng)建正則表達(dá)式對(duì)象 var array=regex.exec(myString); if (array){ var str="找到了匹配子串!"+"\n返回?cái)?shù)組的值為:"+array+"\n數(shù)組元素個(gè)數(shù):" +array.length+"\n被搜索的字符串為:"+array.input +"\n匹配子串的開(kāi)始位置為:"+array.index +"\n匹配子串后面第一個(gè)字符的位置為:"+regex.lastIndex; alert(str); } else{ alert("未找到匹配子串!!"); } </script> </head> <body> </body> </html>