在實際做專案過程中會經常遇到需要驗證的情況,這時候如果對正規表示式不夠了解,就需要經常去網上找,顯得low,為了能夠自己手寫正則,在下花功夫做了一些筆記,並且用這些知識做了一個正則的程式碼庫,方便平時自己使用。
宣告:
- ES9代表ES2018,如果特性後加了ES9,那麼代表是ES2018中新增的特性
1. 簡介
正規表示式(Regular Expression) 是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個規則字串,這個規則字串用來表達對字串的一種過濾邏輯。
簡單來說就是:按照某種規則去匹配符合條件的字串。正規表示式的規則是/ pattern / flags
可以使用字面量形式或者new的方式來建立正規表示式
// 使用直接字面量建立 ,推薦使用,效能更好,注意這裡pattern不能為空,不然以為是註釋
var exp1 = /d/g
// 使用RegExp物件建立
var exp2 = new RegExp(`d`, `g`);
模式中使用的所有元字元都建議在之前加轉義,正規表示式中的元字元包括:
( [ { ^ $ | ) ? * + . ] }
2. 內容
2.1 匹配模式
修飾符表示正規表示式的匹配模式
修飾符 | 描述 |
---|---|
i | 執行對大小寫不敏感的匹配 |
g | 執行全域性匹配,查詢所有匹配而非在找到第一個匹配後停止 |
m | 執行多行匹配,會改變^ 和$ 的行為 |
u | 可以匹配4位元組的unicode編碼 |
s (ES9) | dotAll模式,. 可以匹配換行符 |
加了u修飾符,會正確處理大於uFFFF
的unicode,比如4位元組的? uD83DuDC2A
/^uD83D/.test(`uD83DuDC2A`) // true
/^uD83D/u.test(`uD83DuDC2A`) // false
預設情況下,.
可以匹配任意字元,除了換行符,且.
不能匹配Unicode字元,需要使用u選項啟用Unicode模式才行。
ES2018引入了dotAll模式,通過s選項可以啟用,這樣,.
就可以匹配換行符了。
/foo.bar/.test(`foo
bar`); // false
/foo.bar/s.test(`foo
bar`); // true
2.2 類
類使用[ ]
來表達,用於查詢某個範圍內的字元
表示式 | 描述 |
---|---|
[abc] |
查詢方括號之間的任何字元 |
[0-9] |
查詢任何從 0 至 9 的數字 |
還有一些預定義類方便我們直接使用:
預定義類 | 等價 | 描述 |
---|---|---|
s |
[ |
空格 |
S |
[^ |
非空格 |
d |
[0-9] |
數字 |
D |
[^0-9] |
非數字 |
w |
[a-zA-Z_0-9] |
單詞字元 ( 字母、數字、下劃線) |
W |
[^a-zA-Z_0-9] |
非單詞字元 |
. |
[^ |
任意字元,除了回車與換行外所有字元 |
f |
x0c cL
|
匹配一個換頁符 |
|
x0a cJ
|
匹配一個換行符 |
|
x0d cM
|
匹配一個回車符 |
|
x09 cI
|
匹配一個製表符 |
v |
x0b cK
|
匹配一個垂直製表符 |
xxx |
查詢以八進位制數 xxx 規定的字元 | |
xdd |
查詢以十六進位制數 dd 規定的字元 | |
uxxxx |
查詢以十六進位制數 xxxx 規定的 Unicode 字元 |
2.3 量詞
量詞表示匹配多少個目標物件,精確匹配長度使用{ }
量詞 | 等價 | 描述 |
---|---|---|
n*
|
{0,} |
匹配零個或多個n |
n+
|
{1,} |
匹配至少一個 n 的字串 |
n?
|
{0,1} |
匹配零個或一個n |
{n} |
匹配n次 | |
{n,m} |
匹配n到m次 | |
{n,} |
至少匹配n次 |
2.4 邊界
邊界 | 描述 |
---|---|
^ |
以xx開始,在類[ ] 中表示非 |
$ |
以xx結束 |
|
單詞邊界 |
B |
非單詞邊界 |
^
匹配字串開始位置,也就是位置0,如果設定了 RegExp 物件的 Multiline 屬性m
,^
也匹配 `n` 或 `r` 之後的位置
$
一般匹配字串結束位置,如果設定了 RegExp 物件的 Multiline 屬性m
,$
也匹配 `n` 或 `r` 之前的位置
匹配一個單詞邊界,也就是指單詞和空格間的位置,如
er
可以匹配”never” 中的 `er`,但不能匹配 “verb” 中的 `er`
B
匹配非單詞邊界。如 erB
能匹配 “verb” 中的 `er`,但不能匹配 “never” 中的 `er`
2.5 分組
分組使用( )
,作用是提取相匹配的字串,使量詞作用於分組
比如hehe{3}
是把e
匹配了3次而不是單詞,如果希望作用於單詞,可以使用分組(hehe){3}
或
分組中使用 |
可以達到或的效果
比如:T(oo|ii)m
可以匹配 Toom 和 Tiim
`abToomhaTiimmm`.replace(/T(oo|ii)m/g, `-`) // ab-ha-mm
反向引用
使用( )
後可以使用$1
–$9
等來匹配
`2018-02-11`.replace(/(d{4})-(d{2})-(d{2})/g, `$2/$3/$1`) // 02/11/2018
後向引用
表示後向引用,
1
是指在正規表示式中,從左往右數第1個( )
中的內容;以此類推,2
表示第2個( )
,