天天看點

javascript的正規表達式文法和常用方法說明

  一、正規表達式文法 字元 描述

  \ 将下一個字元标記為一個特殊字元、或一個原義字元、或一個 後向引用、或一個八進制轉義符。例如,'n' 比對字元 "n"。'\n' 比對一個換行符。序列 '\\' 比對 "\" 而 "\(" 則比對 "("。

  ^ 比對輸入字元串的開始位置。如果設定了 RegExp 對象的 Multiline 屬性,^ 也比對 '\n' 或 '\r' 之後的位置。

  $ 比對輸入字元串的結束位置。如果設定了RegExp 對象的 Multiline 屬性,$ 也比對 '\n' 或 '\r' 之前的位置。

  * 比對前面的子表達式零次或多次。例如,zo* 能比對 "z" 以及 "zoo"。 * 等價于{0,}。

  + 比對前面的子表達式一次或多次。例如,'zo+' 能比對 "zo" 以及 "zoo",但不能比對 "z"。+ 等價于 {1,}。

  ? 比對前面的子表達式零次或一次。例如,"do(es)?" 可以比對 "do" 或 "does" 中的"do" 。? 等價于 {0,1}。

  {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 表達式。

  (?=pattern) 正向預查,在任何比對 pattern 的字元串開始處比對查找字元串。這是一個非擷取比對,也就是說,該比對不需要擷取供以後使用。例如, 'Windows (?=95|98|NT|2000)' 能比對 "Windows 2000" 中的 "Windows" ,但不能比對 "Windows 3.1" 中的 "Windows"。預查不消耗字元,也就是說,在一個比對發生後,在最後一次比對之後立即開始下一次比對的搜尋,而不是從包含預查的字元之後開始。

  (?!pattern) 負向預查,在任何不比對Negative lookahead matches the search string at any point where a string not matching pattern 的字元串開始處比對查找字元串。這是一個非擷取比對,也就是說,該比對不需要擷取供以後使用。例如'Windows (?!95|98|NT|2000)' 能比對 "Windows 3.1" 中的 "Windows",但不能比對 "Windows 2000" 中的 "Windows"。預查不消耗字元,也就是說,在一個比對發生後,在最後一次比對之後立即開始下一次比對的搜尋,而不是從包含預查的字元之後開始

  x|y 比對 x 或 y。例如,'z|food' 能比對 "z" 或 "food"。'(z|f)ood' 則比對 "zood" 或 "food"。

  [xyz] 字元集合。比對所包含的任意一個字元。例如, '[abc]' 可以比對 "plain" 中的 'a'。

  [^xyz] 負值字元集合。比對未包含的任意字元。例如, '[^abc]' 可以比對 "plain" 中的'p'。

  [a-z] 字元範圍。比對指定範圍内的任意字元。例如,'[a-z]' 可以比對 'a' 到 'z' 範圍内的任意小寫字母字元。

  [^a-z] 負值字元範圍。比對任何不在指定範圍内的任意字元。例如,'[^a-z]' 可以比對任何不在 'a' 到 'z' 範圍内的任意字元。

  \b 比對一個單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 可以比對"never" 中的 'er',但不能比對 "verb" 中的 'er'。

  \B 比對非單詞邊界。'er\B' 能比對 "verb" 中的 'er',但不能比對 "never" 中的 'er'。

  \cx 比對由x指明的控制字元。例如, \cM 比對一個 Control-M 或回車符。 x 的值必須為 A-Z 或 a-z 之一。否則,将 c 視為一個原義的 'c' 字元。

  \d 比對一個數字字元。等價于 [0-9]。

  \D 比對一個非數字字元。等價于 [^0-9]。

  \f 比對一個換頁符。等價于 \x0c 和 \cL。

  \n 比對一個換行符。等價于 \x0a 和 \cJ。

  \r 比對一個回車符。等價于 \x0d 和 \cM。

  \s 比對任何空白字元,包括空格、制表符、換頁符等等。等價于 [ \f\n\r\t\v]。

  \S 比對任何非空白字元。等價于 [^ \f\n\r\t\v]。

  \t 比對一個制表符。等價于 \x09 和 \cI。

  \v 比對一個垂直制表符。等價于 \x0b 和 \cK。

  \w 比對包括下劃線的任何單詞字元。等價于'[A-Za-z0-9_]'。

  \W 比對任何非單詞字元。等價于 '[^A-Za-z0-9_]'。

  \xn 比對 n,其中 n 為十六進制轉義值。十六進制轉義值必須為确定的兩個數字長。例如, '\x41' 比對 "A"。'\x041' 則等價于 '\x04' & "1"。正規表達式中可以使用 ASCII 編碼。.

  \num 比對 num,其中 num 是一個正整數。對所擷取的比對的引用。例如,'(.)\1' 比對兩個連續的相同字元。

  \n 辨別一個八進制轉義值或一個後向引用。如果 \n 之前至少 n 個擷取的子表達式,則 n 為後向引用。否則,如果 n 為八進制數字 (0-7),則 n 為一個八進制轉義值。

  \nm 辨別一個八進制轉義值或一個後向引用。如果 \nm 之前至少有is preceded by at least nm 個擷取得子表達式,則 nm 為後向引用。如果 \nm 之前至少有 n 個擷取,則 n 為一個後跟文字 m 的後向引用。如果前面的條件都不滿足,若 n 和 m 均為八進制數字 (0-7),則 \nm 将比對八進制轉義值 nm。

  \nml 如果 n 為八進制數字 (0-3),且 m 和 l 均為八進制數字 (0-7),則比對八進制轉義值 nml。

  \un 比對 n,其中 n 是一個用四個十六進制數字表示的 Unicode 字元。例如, \u00A9 比對版權符号 (?)。

  二、常用方法說明

  1.compile方法

  這個方法主要是可以改變pattern的值和flags的值,js幫助文檔中說在for循環中執行compile可以提高效率,測試了下,執行時間沒有什麼不同。這個稍後再研究下:

  function testCompile(){

  var sStr = "AaBbCcDd";

  var reg= new RegExp("[A-Z]","g");

  var r1 = sStr.match(reg);

  alert(r1); //r1數組:A,B,C,D

  reg.compile("[a-z]","g"); //産生一個的正規表達式

  var r2=sStr.match(reg);

  alert(r2); //r1數組:a,b,c,d

  }

  2.exec方法

  RegExp的exec方法,主要比對出第一個符合模式串的字元串。如果flags中設定了"g"屬性,那麼比對的位置将從上次比對成功的位置開始比對。如果沒有設定這個屬性,exec方法隻會從比對字元串的開始位置開始比對。由于exec方法隻比對第一個符合模式串的字元串,是以在沒有設定flags屬性中的"g"值時,即使循環取比對值,每次取到的值都是一樣的。如果設定了,那麼擷取的值将不一樣。

  隻傳回第一個比對的值:

  function testExec(){

  var sStr = "AaBbCcDd";

  var reg= new RegExp("[A-Z]","g");

  var r1 =reg.exec(sStr);

  alert(r1); //列印出第一個比對的字元串:"A"

  }

  利用循環傳回所有比對的字元串:

  function testExec(){

  var sStr = "AaBbCcDd";

  var reg= new RegExp("[A-Z]","g");

  var r1;

  while( (r1 = reg.exec(sStr)) !=null){

  alert(r1); //依次列印出:"A","B","C","D"

  }

  }

  3.test方法

  傳回字元串中是否包含符合模式串中的字元串。如果含有則傳回true,如果沒有則傳回false。

  function test(){

  var sStr = "AaBbCcDd";

  var reg= new RegExp("[A-Z]","g");

  alert(reg.test(sStr)); // 列印 true

  reg.compile("[0-9]","g");

  alert(reg.test(sStr)); // 列印 false

  }

  4.如果要比對多個傳回值,可以用String.match方法

  function testStringMath(){

  var sStr = "AaBbCcDd";

  var reg= new RegExp("[a-z]","g");

  var r1 = sStr.match(reg);

  alert("傳回數組大小:" + r1.length); //數組長度為4

  for(var i=0;i<r1.length;i++){

  alert(r1[i]); //依次列印:"a","b","c","d"

  }

  }

繼續閱讀