這裡是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]
非單詞字元