天天看點

JS的正規表達式1

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd>

正規表達式使用詳解

簡介

簡單的說,正規表達式是一種可以用于模式比對和替換的強有力的工具。其作用如下:

測試字元串的某個模式。例如,可以對一個輸入字元串進行測試,看在該字元串是否存在一個電話号碼模式或一個信用卡号碼模式。這稱為資料有效性驗證。

替換文本。可以在文檔中使用一個正規表達式來辨別特定文字,然後可以全部将其删除,或者替換為别的文字。

根據模式比對從字元串中提取一個子字元串。可以用來在文本或輸入字段中查找特定文字。

基本文法

在對正規表達式的功能和作用有了初步的了解之後,我們就來具體看一下正規表達式的文法格式。

正規表達式的形式一般如下:  

/love/  其中位于“/”定界符之間的部分就是将要在目标對象中進行比對的模式。使用者隻要把希望查找比對對象的模式内容放入“/”定界符之間即可。為了能夠使使用者更加靈活的定制模式内容,正規表達式提供了專門的“元字元”。所謂元字元就是指那些在正規表達式中具有特殊意義的專用字元,可以用來規定其前導字元(即位于元字元前面的字元)在目标對象中的出現模式。

較為常用的元字元包括: “+”, “*”,以及 “?”。

“+”元字元規定其前導字元必須在目标對象中連續出現一次或多次。

“*”元字元規定其前導字元必須在目标對象中出現零次或連續多次。

“?”元字元規定其前導對象必須在目标對象中連續出現零次或一次。

下面,就讓我們來看一下正規表達式元字元的具體應用。

/fo+/  因為上述正規表達式中包含“+”元字元,表示可以與目标對象中的 “fool”, “fo”, 或者 “football”等在字母f後面連續出現一個或多個字母o的字元串相比對。

/eg*/  因為上述正規表達式中包含“*”元字元,表示可以與目标對象中的 “easy”, “ego”, 或者 “egg”等在字母e後面連續出現零個或多個字母g的字元串相比對。

/Wil?/  因為上述正規表達式中包含“?”元字元,表示可以與目标對象中的 “Win”, 或者“Wilson”,等在字母i後面連續出現零個或一個字母l的字元串相比對。

有時候不知道要比對多少字元。為了能适應這種不确定性,正規表達式支援限定符的概念。這些限定符可以指定正規表達式的一個給定元件必須要出現多少次才能滿足比對。

{n} n 是一個非負整數。比對确定的 n 次。例如,'o{2}' 不能比對 "Bob" 中的 'o',但是能比對 "food" 中的兩個 o。

{n,} n 是一個非負整數。至少比對 n 次。例如,'o{2,}' 不能比對 "Bob" 中的 'o',但能比對 "foooood" 中的所有 o。'o{1,}' 等價于 'o+'。'o{0,}' 則等價于 'o*'。

{n,m} m 和 n 均為非負整數,其中n <= m。最少比對 n 次且最多比對 m 次。例如,"o{1,3}" 将比對 "fooooood" 中的前三個 o。'o{0,1}' 等價于 'o?'。請注意在逗号和兩個數之間不能有空格。

除了元字元之外,使用者還可以精确指定模式在比對對象中出現的頻率。例如,/jim {2,6}/ 上述正規表達式規定字元m可以在比對對象中連續出現2-6次,是以,上述正規表達式可以同jimmy或jimmmmmy等字元串相比對。

在對如何使用正規表達式有了初步了解之後,我們來看一下其它幾個重要的元字元的使用方式。

代碼

\s:用于比對單個空格符,包括tab鍵和換行符;    

\S:用于比對除單個空格符之外的所有字元;    

\d:用于比對從0到9的數字;    

\w:用于比對字母,數字或下劃線字元;    

\W:用于比對所有與\w不比對的字元;    

. :用于比對除換行符之外的所有字元。    

(說明:我們可以把\s和\S以及\w和\W看作互為逆運算)

下面,我們就通過執行個體看一下如何在正規表達式中使用上述元字元。

/\s+/ 上述正規表達式可以用于比對目标對象中的一個或多個空格字元。

/\d000/ 如果我們手中有一份複雜的财務報表,那麼我們可以通過上述正規表達式輕而易舉的查找到所有總額達千元的款項。

除了我們以上所介紹的元字元之外,正規表達式中還具有另外一種較為獨特的專用字元,即定位符。定位符用于規定比對模式在目标對象中的出現位置。 較為常用的定位符包括: “^”, “$”, “\b” 以及 “\B”。

“^”定位符規定比對模式必須出現在目标字元串的開頭   

“$”定位符規定比對模式必須出現在目标對象的結尾   

“\b”定位符規定比對模式必須出現在目标字元串的開頭或結尾的兩個邊界之一   

“\B”定位符則規定比對對象必須位于目标字元串的開頭和結尾兩個邊界之内,   

       即比對對象既不能作為目标字元串的開頭,也不能作為目标字元串的結尾。   

同樣,我們也可以把“^”和“$”以及“\b”和“\B”看作是互為逆運算的兩組定位符。舉例來說: /^hell/ 因為上述正規表達式中包含“^”定位符,是以可以與目标對象中以 “hell”, “hello”或“hellhound”開頭的字元串相比對。 /ar$/ 因為上述正規表達式中包含“$”定位符,是以可以與目标對象中以 “car”, “bar”或 “ar” 結尾的字元串相比對。 /\bbom/ 因為上述正規表達式模式以“\b”定位符開頭,是以可以與目标對象中以 “bomb”, 或 “bom”開頭的字元串相比對。/man\b/ 因為上述正規表達式模式以“\b”定位符結尾,是以可以與目标對象中以 “human”, “woman”或 “man”結尾的字元串相比對。

為了能夠友善使用者更加靈活的設定比對模式,正規表達式允許使用者在比對模式中指定某一個範圍而不局限于具體的字元。例如:

/[A-Z]/  上述正規表達式将會與從A到Z範圍内任何一個大寫字母相比對。   

/[a-z]/  上述正規表達式将會與從a到z範圍内任何一個小寫字母相比對。    

/[0-9]/  上述正規表達式将會與從0到9範圍内任何一個數字相比對。    

/([a-z][A-Z][0-9])+/ 上述正規表達式将會與任何由字母和數字組成的字元串,如 “aB0” 等相比對。   

這裡需要提醒使用者注意的一點就是可以在正規表達式中使用 “()” 把字元串組合在一起。“()”符号包含的内容必須同時出現在目标對象中。是以,上述正規表達式将無法與諸如 “abc”等的字元串比對,因為“abc”中的最後一個字元為字母而非數字。

如果我們希望在正規表達式中實作類似程式設計邏輯中的“或”運算,在多個不同的模式中任選一個進行比對的話,可以使用管道符 “|”。例如:/to|too|2/ 上述正規表達式将會與目标對象中的 “to”, “too”, 或 “2” 相比對。

正規表達式中還有一個較為常用的運算符,即否定符 “[^]”。與我們前文所介紹的定位符 “^” 不同,否定符 “[^]”規定目标對象中不能存在模式中所規定的字元串。例如:/[^A-C]/ 上述字元串将會與目标對象中除A,B,和C之外的任何字元相比對。一般來說,當“^”出現在 “[]”内時就被視做否定運算符;而當“^”位于“[]”之外,或沒有“[]”時,則應當被視做定位符。

最後,當使用者需要在正規表達式的模式中加入元字元,并查找其比對對象時,可以使用轉義符“\”。例如:/Th\*/  上述正規表達式将會與目标對象中的“Th*”而非“The”等相比對。

在構造正規表達式之後,就可以象數學表達式一樣來求值,也就是說,可以從左至右并按照一個優先級順序來求值。優先級如下:

1.\ 轉義符   

2.(), (?:), (?=), [] 圓括号和方括号   

3.*, +, ?, {n}, {n,}, {n,m} 限定符   

4.^, $, \anymetacharacter 位置和順序   

5.|“或”操作   

使用執行個體

在JavaScript 1.2中帶有一個功能強大的RegExp()對象,可以用來進行正規表達式的比對操作。其中的test()方法可以檢驗目标對象中是否包含比對模式,并相應的傳回true或false。

我們可以使用JavaScript編寫以下腳本,驗證使用者輸入的郵件位址的有效性。

<html>    

<head>    

  <script language="Javascript1.2">    

     <!-- start hiding    

     function verifyAddress(obj)    

     {    

      var email = obj.email.value;    

      var pattern =    

/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;    

      flag = pattern.test(email);    

      if(flag)    

      {    

       alert(“Your email address is correct!”);    

       return true;    

      }    

      else    

       {    

        alert(“Please try again!”);    

        return false;    

        }    

      }    

     // stop hiding -->    

    </script>    

  </head>    

  <body>    

   <form onSubmit="return verifyAddress(this);">    

    <input name="email" type="text">    

    <input type="submit">    

    </form>    

  </body>    

</html>    

正規表達式對象

本對象包含正規表達式模式以及表明如何應用模式的标志。

文法 1 re = /pattern/[flags]   

文法 2 re = new RegExp("pattern",["flags"])    

參數

re

必選項。将要指派為正規表達式模式的變量名。

Pattern

必選項。要使用的正規表達式模式。如果使用文法 1,用 "/" 字元分隔模式。如果用文法 2,用引号将模式引起來。

Flags

可選項。如果使用文法 2 要用引号将 flag 引起來。标志可以組合使用,可用的有:

g (全文查找出現的所有 pattern)    

i (忽略大小寫)    

m (多行查找)    

示例

下面的示例建立一個包含正規表達式模式及相關标志的對象(re),向您示範正規表達式對象的用法。在本例中,作為結果的正規表達式對象又用于 match 方法中:

function MatchDemo()   

{   

var r, re; // 聲明變量。   

var s = "The rain in Spain falls mainly in the plain";   

re = new RegExp("ain","g"); // 建立正規表達式對象。   

r = s.match(re); // 在字元串 s 中查找比對。   

return(r);    

}   

傳回值: ain,ain,ain,ain\\

屬性 lastIndex 屬性 | source 屬性\\

方法 compile 方法 | exec 方法 | test 方法\\

要求 版本 3\\

請參閱 RegExp 對象 | 正規表達式文法 | String 對象\\

exec 方法

用正規表達式模式在字元串中運作查找,并傳回包含該查找結果的一個數組。

rgExp.exec(str)

rgExp

必選項。包含正規表達式模式和可用标志的正規表達式對象。

str

必選項。要在其中執行查找的 String 對象或字元串文字。

說明\\

如果 exec 方法沒有找到比對,則它傳回 null。如果它找到比對,則 exec 方法傳回一個數組,并且更新全局 RegExp 對象的屬性,以反映比對結果。數組的0元素包含了完整的比對,而第1到n元素中包含的是比對中出現的任意一個子比對。這相當于沒有設定全局标志 (g) 的 match 方法。

如果為正規表達式設定了全局标志,exec 從以 lastIndex 的值訓示的位置開始查找。如果沒有設定全局标志,exec 忽略 lastIndex 的值,從字元串的起始位置開始搜尋。

exec 方法傳回的數組有三個屬性,分别是 input、index 和 lastIndex。Input 屬性包含了整個被查找的字元串。Index 屬性中包含了整個被查找字元串中被比對的子字元串的位置。LastIndex 屬性中包含了比對中最後一個字元的下一個位置。

示例\\

下面的例子舉例說明了 exec 方法的用法:

function RegExpTest()   

var ver = Number(ScriptEngineMajorVersion() + "." + ScriptEngineMinorVersion())   

if (ver >= 5.5){ // 測試 JScript 的版本。   

var src = "The rain in Spain falls mainly in the plain.";   

var re = /\w+/g; // 建立正規表達式模式。   

var arr;   

while ((arr = re.exec(src)) != null)   

document.write(arr.index + "-" + arr.lastIndex + arr + "\t");   

else{   

alert("請使用 JScript 的更新版本");   

傳回值:0-3The 4-8rain 9-11in 12-17Spain 18-23falls 24-30mainly 31-33in 34-37the 38-43plain

test 方法\\

傳回一個 Boolean 值,它指出在被查找的字元串中是否存在模式。

rgexp.test(str)

參數\\

rgexp

必選項。包含正規表達式模式或可用标志的正規表達式對象。

必選項。要在其上測試查找的字元串。

說明

test 方法檢查在字元串中是否存在一個模式,如果存在則傳回 true,否則就傳回 false。

全局 RegExp 對象的屬性不由 test 方法來修改。

下面的例子舉例說明了 test 方法的用法:

function TestDemo(re, s)   

var s1; // 聲明變量。   

// 檢查字元串是否存在正規表達式。   

if (re.test(s)) // 測試是否存在。   

s1 = " contains "; // s 包含模式。   

else  

s1 = " does not contain "; // s 不包含模式。   

return("'" + s + "'" + s1 + "'"+ re.source + "'"); // 傳回字元串。   

函數調用:document.write (TestDemo(/ain+/ ,"The rain in Spain falls mainly in the plain."));

傳回值:'The rain in Spain falls mainly in the plain.' contains 'ain+'

match 方法

使用正規表達式模式對字元串執行查找,并将包含查找的結果作為數組傳回。\\

stringObj.match(rgExp)

stringObj

必選項。對其進行查找的 String 對象或字元串文字。

必選項。為包含正規表達式模式和可用标志的正規表達式對象。也可以是包含正規表達式模式和可用标志的變量名或字元串文字。

如果 match 方法沒有找到比對,傳回 null。如果找到比對傳回一個數組并且更新全局 RegExp 對象的屬性以反映比對結果。

match 方法傳回的數組有三個屬性:input、index 和 lastIndex。Input 屬性包含整個的被查找字元串。Index 屬性包含了在整個被查找字元串中比對的子字元串的位置。LastIndex 屬性包含了最後一次比對中最後一個字元的下一個位置。

如果沒有設定全局标志 (g),數組的 0 元素包含整個比對,而第 1 到 n 元素包含了比對中曾出現過的任一個子比對。這相當于沒有設定全局标志的 exec 方法。如果設定了全局标志,元素 0 到 n 中包含所有比對。

下面的示例示範了match 方法的用法:

re = /ain/i; // 建立正規表達式模式。   

r = s.match(re); // 嘗試比對搜尋字元串。   

return(r); // 傳回第一次出現 "ain" 的地方。   

傳回值:ain

本示例說明帶 g 标志設定的 match 方法的用法。

re = /ain/ig; // 建立正規表達式模式。   

r = s.match(re); // 嘗試去比對搜尋字元串。   

return(r); // 傳回的數組包含了所有 "ain"    

// 出現的四個比對。   

傳回值:ain,ain,ain,ain

上面幾行代碼示範了字元串文字的 match 方法的用法。

var r, re = "Spain";   

r = "The rain in Spain".replace(re, "Canada");   

return r;   

傳回值:The rain in Canada

search 方法

傳回與正規表達式查找内容比對的第一個子字元串的位置。

stringObj.search(rgExp)

必選項。要在其上進行查找的 String 對象或字元串文字。

search 方法指明是否存在相應的比對。如果找到一個比對,search 方法将傳回一個整數值,指明這個比對距離字元串開始的偏移位置。如果沒有找到比對,則傳回 -1。

下面的示例示範了 search 方法的用法。

function SearchDemo()   

var s = "The rain in Spain falls mainly in the plain.";   

re = /falls/i; // 建立正規表達式模式。   

r = s.search(re); // 查找字元串。   

return(r); // 傳回 Boolean 結果。   

傳回值:18

本文轉自 netcorner 部落格園部落格,原文連結: http://www.cnblogs.com/netcorner/archive/2007/06/01/2912371.html ,如需轉載請自行聯系原作者

繼續閱讀