天天看點

JavaScript正規表達式快速判斷技巧

  這裡是JS的正則的一點心得,并不是最完整的規則彙總,更側重實際運用中的快速判斷,初學者接觸正則之後往往會被一堆星号括号給弄暈,有了一些速判技巧就能從整體上把握進而不慌亂。

  JS正則快速判斷技巧的核心就是:注意圓括号和問号。這已經能夠應付大部分實際應用了。

一、圓括号

  衆所周知,正則中中括号表示範圍,大括号表示重複次數,圓括号表示分組。

  圓括号表示分組,但是分組内還有很多文章,細分一下:

       (1):圓括号本身表示分組,同時會儲存比對的項,這叫捕獲性分組,預設都是這樣的,比如:

         var c="a001”;  /a(\d*)/.test(c);  console.log(RegExp.$1);    //001

         var num=“1234 5678”;  var newNum=num.replace(/(\d{4}) (\d{4})/,”$2 $1");

       (2):如果不想儲存,就采用非捕獲性分組(?:),比如:

         var c="a001”;  /a(?:\d*)/.test(c);  console.log(RegExp.$1);     //空

       (3):圓括号的分組裡,可以對字元組合使用限定符,并且其後可以跟次數,比如:(A\d){2}比對A3A5

       (4):從分組裡多個直接量中選擇一個。比如:g(A|a)y,不過這種情況用 g[Aa]y 更快

       (5):當模式中有嵌套圓括号時,變量的編号會按照圓括号開始出現的位置一次進行,比如:

            /([A-Za-z](\d{2}))((-)\d{2})/比對”A22-33”時,比對情況如下:

            $1: A22, $2: 22, $3: -33, $4: -

       (6): (?:)表示非捕獲性分組,(?=)則表示正向前瞻分組,a(?=reg)比對後邊跟着reg的a;

       (7): (?!)則表示負向前瞻分組,a(?!reg)比對後邊不跟着reg的a;

       (8): (?<=)和(?<!)表示正向和負向後瞻,JavaScript不支援後瞻;

  前面提到的捕獲性分組,這衍生出一個反向引用,是指在正規表達式中,就使用前面捕獲性分組儲存的内容,用”\”加上序号來引用,比如 /(dog)\1/就可以比對”dogdog”。

二、問号

  問号的用法需要記住三種,除了上面已經提到了在圓括号内部的用法。另外記住下邊兩種用法即可:

  1、如果問号是直接跟在其他字元後面,則作為一個簡單量詞,表示出現零次或一次,簡單量詞還包括:*,+,{n},{n,m},{n,}。

  2、當問号本身是緊跟在其他簡單量詞之後的時候,它不再作為簡單量詞,而是改變了量詞屬性,從貪婪量詞變為惰性量詞。貪婪量詞的意思是在比對的時候先一口氣比對整個字元串,發現比對不了的時候,去掉最後一個字元,再比對,直到長度為零。惰性量詞則相反,一次比對前面一個字元,發現不比對就再比對一個。(還有一種支配量詞,是在簡單量詞之後連上加号,前面兩種量詞都會反複嘗試,而支配量詞隻嘗試一次,失敗就算了。JavaScript不支援支配量詞。)。

所有簡單量詞本身都是貪婪量詞。比如:

數組的第一項表示字元串中與整個模式比對的字元串,之後的每一項(如果有)儲存着與正規表達式中的捕獲組比對的字元串。

  看,其實東西也不多,隻要記住了圓括号和問号的用法,就可以快速将正則式加以分割然後逐個了解,進而不會被一堆問号星号括号給弄暈了。當然最基礎的一些知識還是要具備的,不過是純記憶性質的,比較簡單了,附上一些常用知識:

字元

正則

描述

\t

/\t/

制表符

\n

/\n/

\r

/\r/

回車符

\f

/\f/

換頁符

\a

/\a/

alert字元

\e

/\e/

escape字元

\cX

/\cX/

與X相對應的控制字元

\b

/\b/

與回退字元

\v

/\v/

垂直制表符

\0

/\0/

空字元

等同于

.

[^\n\r]

除了換行和回車之外的任意字元

\d

[0-9]

數字字元

\D

[^0-9]

非數字字元

\s

[ \t\n\x0B\f\r]

空白字元

\S

[^ \t\n\x0B\f\r]

非空白字元

\w

[a-zA-Z_0-9]

單詞字元(所有的字母)

\W

[^a-zA-Z_0-9]

非單詞字元 

繼續閱讀