JS 中正規表示式必知必會

SHERlocked93發表於2018-02-11

在實際做專案過程中會經常遇到需要驗證的情況,這時候如果對正規表示式不夠了解,就需要經常去網上找,顯得low,為了能夠自己手寫正則,在下花功夫做了一些筆記,並且用這些知識做了一個正則的程式碼庫,方便平時自己使用。

宣告:

  1. 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 [
x0Bf
]
空格
S [^
x0Bf
]
非空格
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個( )

相關文章