JavaScript使用正則表達


正則表達式概述
在前面已經涉及了一些正則表達式的用法,現在將系統地學習正則表達式的語法和用途。正則表達式主要用於進行字符串的模式匹配,例如判斷一個字符串是否符合指定格式等。例如在windows下搜索文件,可以用“*”或者“?”這樣的通配符。在正則表達式的語法中,有更多這樣的符號用於表示一個字符串的模式,表7.1列出了所有的特殊符號,它們也被稱為元字符。

image

image

image

使用這些元字符,可以表示具有特定模式的字符串,例如:
/^\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列出了正則表達式的所有方法。

image

在執行完字符串匹配后,匹配結果會以RegExp靜態屬性的方式提供給腳本程序,每次執行exec都會改變這些靜態屬性,表7.3列出了RegExp對象的靜態屬性。

表7.3 正則表達式對象RegExp的靜態屬性

image

由此可見,所有的匹配結果都保存在同一個位置,當執行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>
當需要提取多個子模式時,可以使用RegExp.$1~RegExp.$9依次獲取得到的子字符串。如果需要得到的子模式不只9個,也可以使用exec返回的數組來獲取子字符串。返回數組的長度為子模式的個數加1,其中數組索引為0的元素表示被搜索的字符串,其后的元素依次對應於模式中的括號。例如上面的例子也可以用下面的代碼實現:
<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>
這段代碼的最后結果顯示為8。和indexOf方法不同,該方法接收的是一個正則表達式,而indexOf只能接收一個字符串。但兩者的行為是類似的。

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的元素則包含了子匹配得到的字符。若設定了全局模式,則數組包含了搜索到的所有整體匹配項。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM