RegExp對象(至今為止我看到過的最通俗易懂和深入的Regex教程)JavaScript提供了一個RegExp對象來完成有關Regex的操作和功能,每一條Regex模式對應一個RegExp執行個體。有兩種方式可以建立RegExp對象的執行個體。
使用RegExp的顯式建構函式,文法為:new RegExp("pattern"[,"flags"])。
使用RegExp的隱式建構函式,採用純文字格式:/pattern/[flags]。
pattern部分為要使用的Regex模式文本,是必須的。在第一種方式中,pattern部分以JavaScript字串的形式存在,需要使用雙引號或單引號括起來;在第二種方式中,pattern部分嵌套在兩個“/”之間,不能使用引號。
flags部分設定Regex的標誌資訊,是可選項。如果設定flags部分,在第一種方式中,以字串的形式存在;在第二種方式中,以文本的形式緊接在最後一個“/”字元之後。flags可以是以下標誌字元的組合。
g是全域標誌。如果設定了這個標誌,對某個文本執行搜尋和替換操作時,將對文本中所有匹配的部分起作用。如果不設定這個標誌,則僅搜尋和替換最早匹配的內容。
i是忽略大小寫標誌。如果設定了這個標誌,進行匹配比較時,將忽略大小寫。
m是多行標誌。如果不設定這個標誌,那麼元字元“^”只與整個被搜尋字串的開始位置相匹配,而元字元“$”只與被搜尋字串的結束位置相匹配。如果設定 了這個標誌,“^”還可以與被搜尋字串中的“\n”或“\r”之後的位置(即下一行的行首)相匹配,而“$”還可以與被搜尋字串中的“\n”或“\ r”之後的位置(即下一行的行尾)相匹配。
代碼8.1是一個建立Regex的例子。
代碼8.1 建立Regex:8.1.htm
- <html>
-
- <head>
-
- <title>建立Regex </title>
-
- <script language = "JavaScript">
-
- var myString="這是第一個Regex的例子";
-
- var myregex = new RegExp("一個"); // 建立Regex
-
- if (myregex.test(myString)){
-
- document.write("找到了指定的模式!");
-
- }
-
- else{
-
- document.write("未找到指定的模式。");
-
- }
-
- </script>
-
- </head><body></body>
-
- </html>
由於JavaScript字串中的“\”是一個逸出字元,因此,使用顯式建構函式建立RegExp執行個體對象時,應將原始Regex中的“\”用“\\”替換。例如,在代碼8.2中的兩條語句是等價的。
代碼8.2 逸出字元中的“\”:8.2.htm
- <script language="javascript">
-
- var re1 = new RegExp("\\d{5}");
-
- var re2 = /\d{5}/;
-
- alert("re1="+re1+"\nre2="+re2);
-
- </script>
可以看出,兩者結果相同。
由於Regex模式文本中的逸出字元也是“\”,如果Regex中要匹配原義字元“\”,在Regex模式文本中要以“\\”來表示,當使用顯式建構函式的方式建立RegExp執行個體對象的時候,就需要使用“\\\\”來表示原義字元“\”。
- var re = new RegExp(\\\\)。
8.4 RegExp對象的屬性
RegExp對象的屬性分為靜態屬性和執行個體屬性。下面分別進行介紹。
8.4.1 靜態屬性
(1)index屬性。是當前運算式模式最初相符內容的開始位置,從0開始計數。其初始值為-1,每次成功匹配時,index屬性都會隨之改變。
(2)input屬性。返回當前所作用的字串,可以簡寫為$_,初始值為空白字串""。
(3)lastIndex屬性。是當前運算式模式最初相符內容中最後一個字元的下一個位置,從0開始計數,常被作為繼續搜尋時的起始位置,初始值為-1,表示從起始位置開始搜尋,每次成功匹配時,lastIndex屬性值都會隨之改變。
(4)lastMatch屬性。是當前運算式模式的最後一個匹配字串,可以簡寫為$&。其初始值為空白字串""。在每次成功匹配時,lastMatch屬性值都會隨之改變。
(5)lastParen屬性。如果運算式模式中有括起來的子匹配,是當前運算式模式中最後的子匹配所匹配到的子字串,可以簡寫為$+。其初始值為空白字串""。每次成功匹配時,lastParen屬性值都會隨之改變。
(6)leftContext屬性。是當前運算式模式最後一個匹配字串左邊的所有內容,可以簡寫為$`(其中“'”為鍵盤上“Esc”下邊的反單引號)。初始值為空白字串""。每次成功匹配時,其屬性值都會隨之改變。
(7)rightContext屬性。是當前運算式模式最後一個匹配字串右邊的所有內容,可以簡寫為$’。初始值為空白字串""。每次成功匹配時,其屬性值都會隨之改變。
(8)$1…$9屬性。這些屬性是唯讀。如果運算式模式中有括起來的子匹配,$1…$9屬性值分別是第1個到第9個子匹配所捕獲到的內容。如果有 超過9個以上的子匹配,$1…$9屬性分別對應最後的9個子匹配。在一個運算式模式中,可以指定任意多個帶括弧的子匹配,但RegExp對象只能儲存最後 的9個子匹配的結果。在RegExp執行個體對象的一些方法所返回的結果數組中,可以獲得所有圓括弧內的子匹配結果。
8.4.2 執行個體屬性
(1)global屬性。返回建立RegExp對象執行個體時指定的global標誌(g)的狀態。如果建立RegExp對象執行個體時設定了g標誌,該屬性返回True,否則返回False,預設值為False。
(2)ignoreCase屬性。返回建立RegExp對象執行個體時指定的ignoreCase標誌(i)的狀態。如果建立RegExp對象執行個體時設定了i標誌,該屬性返回True,否則返回False,預設值為False。
(3)multiLine屬性。返回建立RegExp對象執行個體時指定的multiLine標誌(m)的狀態。如果建立RegExp對象執行個體時設定了m標誌,該屬性返回True,否則返回False,預設值為False。
(4)source屬性。返回建立RegExp對象執行個體時指定的運算式文本字串。
8.5 RegExp對象的方法
RegExp對象的常用方法有test、exec和compile,本節介紹這些方法的功能和用法。最後,對RegExp對象的屬性和方法進行一個綜合舉例。
8.5.1 test方法
文法格式為test(str)。該方法檢查一個字串中是否存在建立RegExp對象執行個體時所指定的運算式模 式,如果存在就返回True,否則返回False。如果找到匹配項,則會更新RegExp對象中的有關靜態屬性,以反映匹配情況。關於該方法的使用,後面 的8.10節中會經常用到,這裡不再單獨舉例。
8.5.2 exec方法
文法格式為exec(str)。該方法使用建立RegExp對象執行個體時所指定的運算式模式對一個字串進行搜尋,並返回一個包含搜尋結果的數組。
如果為Regex設定了全域標誌(g),可以通過多次調用exec和test方法在字串中進行連續搜尋,每次都是從RegExp對象的lastIndex屬性值指定的位置開始搜尋字串。
如果沒有設定全域標誌(g),則exec和test方法忽略RegExp對象的lastIndex屬性值,從字串的起始位置開始搜尋。
如果exec方法沒有找到匹配,傳回值為null;如果找到匹配,則返回一個數組,並更新RegExp對象中有關靜態屬性以反映匹配情況。返回數組中的元素0包含了完整的匹配結果,而元素1~n依次是運算式模式中定義的各個子匹配的結果。
exec方法返回的數組有3個屬性,分別是input、index和lastIndex。
input屬性是整個被搜尋的字串。
index屬性是指匹配在整個被搜尋字串中的位置。
lastIndex屬性是指匹配的子字串的最後一個字元的下一個字元位置。
代碼8.3是對該方法的應用舉例。
代碼8.3 exec()方法應用:8.3.htm
- <html>
-
- <head>
-
- <title>exec()方法應用</title>
-
- <script language = "JavaScript">
-
- var myString="aaa 111 bbb 222 ccc 1111 222ddd";
-
- var regex = /111/; //建立Regex對象
-
- var array=regex.exec(myString);
-
- if (array){
-
- var str="找到了匹配子串!"+"\n返回數組的值為:"+array+"\n數組元素個數:"
-
- +array.length+"\n被搜尋的字串為:"+array.input
-
- +"\n匹配子串的開始位置為:"+array.index
-
- +"\n匹配子串後面第一個字元的位置為:"+regex.lastIndex;
-
- alert(str);
-
- }
-
- else{
-
- alert("未找到匹配子串!!");
-
- }
-
- </script>
-
- <body></body>
-
- </html>
8.5.3 compile方法
文法格式為compile("pattern"[,"flags"])。該方法可以更換RegExp對 象執行個體所使用的運算式模式,並將新的運算式模式編譯為內部格式,從而使以後的匹配過程執行更快。如果要在迴圈中重複使用某個運算式,對其進行編譯將使執行 加速。但是,如果在程式中使用了任何其他運算式模式後,再使用原來編譯過的運算式模式,則這種編譯毫無益處。