JavaScript種正規表達式有兩種定義方式,定義一個比對類似 <%XXX%> 的字元串
1. 構造函數
2. 字面量
g: global,全文搜尋,預設搜尋到第一個結果接停止
i: ingore case,忽略大小寫,預設大小寫敏感
m: multiple lines,多行搜尋(更改^ 和$的含義,使它們分别在任意一行對待行首和行尾比對,而不僅僅在整個字元串的開頭和結尾比對)
正規表達式讓人望而卻步以一個重要原因就是其轉義字元太多了,組合非常之多,但是正規表達式的元字元(在正規表達式中具有特殊意義的專用字元,可以用來規定其前導字元)并不多
元字元:( [ { \ ^ $ | ) ? * + .
并不是每個元字元都有其特定意義,在不同的組合中元字元有不同的意義,分類看一下
字元
含義
\t
水準制表符
\r
回車符
\n
換行符
\f
換頁符
\cX
與X對應的控制字元(Ctrl+X)
\v
垂直制表符
\0
空字元
一般情況下正規表達式一個字元(轉義字元算一個)對應字元串一個字元,表達式 ab\t 的含義是

但是我們可以使用元字元[]來建構一個簡單的類,所謂類是指,符合某些特征的對象,是一個泛指,而不是特指某個字元了,我們可以使用表達式 [abc] 把字元a或b或c歸為一類,表達式可以比對這類的字元
元字元[]組合可以建立一個類,我們還可以使用元字元^建立反向類/負向類,反向類的意思是不屬于XXX類的内容,表達式 [^abc] 表示不是字元a或b或c的内容
按照上面的說明要是我們希望比對單個數字那麼表達式是這樣的
[0123456789]
如果是字母那麼。。。,好麻煩,正規表達式還提供了範圍類,我們可以使用 x-y來連接配接兩個字元表示從x到y的任意字元,這是個閉區間,也就是說包含x和ybenshen,這樣比對小寫字母就很簡單了
[a-z]
要是想比對所有字母呢?在[]組成的類内部是可以連寫的,我們還可以這樣寫 [a-zA-Z]
剛才使用正則我們建立了幾個類,來表示數字,字母等,但這樣寫也很是麻煩,正規表達式為我們提供了幾個常用的預定義類來比對常見的字元
等價類
.
[^\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]
非單詞字元
有了這些預定義類,寫一些正則就很友善了,比如我們希望比對一個 ab+數字+任意字元 的字元串,就可以這樣寫了 ab\d.
正規表達式還提供了幾個常用的邊界比對字元
^
以xx開頭
$
以xx結尾
\b
單詞邊界,指[a-zA-Z_0-9]之外的字元
\B
非單詞邊界
看個不負責任的郵箱正則比對(切勿模仿,小括号後面會講到) \w+@\w+\.(com)$
之前我們介紹的方法都是一一比對的,如果我們希望比對一個連續出現20次數字的字元串難道我們需要寫成這樣
\d\d\d\d...
為此正規表達式引入了一些量詞
?
出現零次或一次(最多出現一次)
+
出現一次或多次(至少出現一次)
*
出現零次或多次(任意次)
{n}
出現n次
{n,m}
出現n到m次
{n,}
至少出現n次
看幾個使用量詞的例子
\w+\b Byron 比對 單詞+邊界+Byron
\d+\.\d{1,3} 比對三位小數的數字
看了上面介紹的量詞,也許愛思考的同學會想到關于比對原則的一些問題,比如{3,5}這個量詞,要是在句子種出現了十次,那麼他是每次比對三個還是五個,反正3、4、5都滿足3~5的條件,量詞在預設下是盡可能多的比對的,也就是大家常說的貪婪模式
既然有貪婪模式,那麼肯定會有非貪婪模式,讓正規表達式盡可能少的比對,也就是說一旦成功比對不不再繼續嘗試,做法很簡單,在量詞後加上 ? 即可
有時候我們希望使用量詞的時候比對多個字元,而不是像上面例子隻是比對一個,比如希望比對Byron出現20次的字元串,我們如果寫成 Byron{20} 的話比對的是Byro+n出現20次,怎麼把Byron作為一個整體呢?使用()就可以達到次目的,我們稱為分組
(Byron){20}
如果希望比對Byron或Casper出現20次該怎麼辦呢?可以使用字元 | 達到或的功效
(Byron|Casper){20}
我們看到圖中有個#1的東東,那是什麼?使用分組的正規表達式會把比對項也放到分組中,預設就是按數字編号分發的,各異根據編号獲得捕獲的分組内容,這個在一些希望具體操作第幾個比對項的函數中很有用
(Byron).(ok)
如果有分組嵌套的情況,外面的組的編号靠前
((^|%>)[^\t]*)
有時候我們不希望捕獲某些分組,隻需要在分組内加上 ?: 就可以了,着并不意味着該分組内容不屬于正規表達式,隻是不會給這個分組加編号了而已
(?:Byron).(ok)
其實在C#等語言中分組還可以起名字,不過JavaScript不支援
表達式
exp1(?=exp2)
比對後面是exp2的exp1
exp1(?!exp2)
比對後面不是exp2的exp1
說的有些抽象,看個例子 good(?=Byron)
通過上面例子可以看出 exp1(?=exp2) 表達式會比對exp1表達式,但隻有其後面内容是exp2的時候才會比對,也就是兩個條件,exp1(?!exp2) 比較類似
good(?!Byron)