正則表達式概述
在前面已經涉及了一些正則表達式的用法,現在將系統地學習正則表達式的語法和用途。正則表達式主要用於進行字符串的模式匹配,例如判斷一個字符串是否符合指定格式等。例如在windows下搜索文件,可以用“*”或者“?”這樣的通配符。在正則表達式的語法中,有更多這樣的符號用於表示一個字符串的模式,表7.1列出了所有的特殊符號,它們也被稱為元字符。
使用這些元字符,可以表示具有特定模式的字符串,例如:
/^\s*$/:匹配一個空行。
/\d{2}-\d{5}/:匹配由兩位數字、一個連字符再加5位數字組成的ID號。
/<\s* (\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>/:匹配HTML標記。
像這種以斜杠開始和結尾的字符序列稱為正則表達式,在JavaScript中可以很方便地使用這些表達式。
使用RegExp對象執行字符串模式匹配
RegExp是JavaScript中的正則表達式對象,利用它可以完成字符串匹配的各種操作。獲得一個RegExp對象可以有兩種方式:
var objRegExp=/pattern*/[flag]
//或者
var objRegExp=new RegExp("pattern" [,"flag"]);
其中pattern是要匹配的模式,flag表示搜索模式,有兩個可選參數,分別是g和i。g表示全局搜索,在后面介紹的replace方法中非常有用;i表示忽略大小寫,默認情況下是大小寫敏感的。例如:
/jack/ig
new RegExp("jack","ig");
都表示全局匹配文本中的“jack”單詞,並且忽略大小寫。
使用這兩種創建方式的效果完全一樣,可以直接使用。第一種方式甚至不需要引用變量,而直接把正則表達式當作對象來使用,例如:
/jack/ig.test(sourceString);
其中test就是正則表達式對象的一個方法,表7.2列出了正則表達式的所有方法。
在執行完字符串匹配后,匹配結果會以RegExp靜態屬性的方式提供給腳本程序,每次執行exec都會改變這些靜態屬性,表7.3列出了RegExp對象的靜態屬性。
表7.3 正則表達式對象RegExp的靜態屬性
由此可見,所有的匹配結果都保存在同一個位置,當執行exec方法后,這些靜態屬性就會改變。因此,必須確保在執行完匹配后立即去使用匹配結果,或將它們保存到另外的變量中,而不再使用RegExp的這些屬性。
提取子字符串
在匹配模式中,可以用小括號將子模式括起來,以獲取子匹配的內容,這些匹配的結果被存儲在RegExp.$1~RegExp.$9中。例如,對於xml片斷:
<author>jack</author> 如果要使用正則表達式獲取其中的作者:jack,可以這樣實現: <script language="JavaScript" type="text/javascript"> <!-- var strXml="<author>jack</author>"; var regExp=/<author>(\w*)<\/author>/; regExp.exec(strXml); var author=RegExp.$1; alert(author); //--> </script>
<script language="JavaScript" type="text/javascript"> <!-- var strXml="<author>jack</author>"; var regExp=/<author>(\w*)<\/author>/; //exec返回一個數組對象 var arr=regExp.exec(strXml); var author=arr[1]; alert(author); //--> </script>
和字符串相關的操作
在前面講字符串相關的操作時,有3個方法的參數需要用到正則表達式,下面給出它們的具體用法。
1.string.search(regularExpression)
其中string是要處理的字符串,regularExpression是匹配模式。該方法在string中查找指定的模式,如果找到,則返回它的第一個字符的索引位置,否則返回-1。例如:
<script language="JavaScript" type="text/javascript"> <!-- var strXml="<author>jack</author>"; var i=strXml.search(/jack/); alert(i); //--> </script>
2.string.replace(regularExpression,replaceString)
其中regularExpression是要查找的模式,replaceString是要替換匹配模式的字符串。regularExpression也可以用普通字符串,但那樣只能替換第一個出現的匹配,之后的匹配則被忽略。使用正則表達式后可以使用全局模式來實現整個替換。替換后原有字符串不發生變化,而是返回一個新的字符串。例如:在實際開發中經常要刪除一段文本中的HTML標記,以獲取純文本,可以使用如下代碼實現。
<script language="JavaScript" type="text/javascript"> <!-- //定義函數用於刪除文本中的Html標記 function stripTags(s) { return s.replace(/<\/?[^>]+>/gi, ''); } var str=stripTags("<author>jack</author>"); alert(str); //--> </script>
最后,將得到去掉Html標記后的文本“jack”。
3.string.match(regularExpression)
該方法根據regularExpression正則表達式模式查找字符串string中的匹配字符項,將結果以數組形式返回。該數組有3個屬性值,與exec方法返回的數組屬性相同。若沒有任何匹配,返回null。
注意:若regularExpression對象未設定全局匹配模式,則數組索引為0的元素就是匹配的整體內容,索引為1~9的元素則包含了子匹配得到的字符。若設定了全局模式,則數組包含了搜索到的所有整體匹配項。