Regex基本
匹配單個字元
匹配單個數位寫法,可以是 “[0-9]
” 也可以是 “\d
”。
匹配單個非數字字元,則使用大寫 “\D
”。
匹配 26 個字母的任意一個,使用 “[a-zA-Z]
”
匹配任意一個字元,使用點號 “.
”
匹配具體字元,則直接寫上去即可。比如 “abcd
” 就是匹配它本身。如果遇到特殊字元,則需要進行轉義,逸出字元為 “\
”。
匹配一個字元,使用中括弧的做法稱為 “字元集”。中括弧用於指定一個 “集”,匹配這個集中的一個字元,如十六進位數 “[0-9a-fA-F]
”。字元集內的點表示的是點號本身,但其他的特殊字元還是需要進行轉移,比如反斜線字元。
使用量詞
貪心匹配
如果要表示某個規則的重複,則需要使用量詞。使用花括弧表示重複次數。比如 8 個數字可以這樣表示:“\d{8}
”
花括弧中的量詞可以變化,比如表示 7 到 8 個數字,則表示為 “\d{7,8}
”。表示上限的右值可以不寫,比如 “{0,}
” 是合法的,表示大於等於 0 個字元;但試圖單獨表示上限的 “{,10}
” 則不合法,至少應該寫為 “{0,10}
”。
加號 “+
” 表示它左邊的元素數量為 “一個或多個”,等於 “{1,}
” 的效果。所以加號也是特殊字元。
星號 “*
” 表示它左邊的元素數量為 “零個或至少一個”,即 “{0,}
”。
問號 “?
” 表示 “零個或一個”,等同於 “{0,1}
”。
懶惰匹配
上面的諸如 +
、*
,匹配的時候都會使用 “貪心” 的模式,也就是匹配盡量多的個數。比如字串 “55555”,使用 “5+
” 去匹配時,會匹配到它能夠找到的最長字串,即 “55555”。
如果在量詞後面加上問號,則使匹配模式變為 “懶惰” 的,也就是匹配最少的。比如使用 “5+?
” 去匹配,則只會找到能夠匹配的最小字元 “5”.
以下都是可用的懶惰匹配運算式:+?
, *?
, {n,}?
, {m,n}?
捕獲分組(類似於宏定義)
可以把運算式中的一部分 “捕獲” 起來,作為宏放在後邊引用。使用括弧進行定義(捕獲),然後再定義的後面使用 “\1
” 進行引用;如果是第二個捕獲,則使用 “\2
”,以此類推。
分組一般都會被儲存起來,但是當運算式非常長的時候,可能需要明確指明不儲存該分組。比如使用這個格式 “(?:THE|The|the)
”,就使用了 “?:
” 標號來表示不要進行命名標記。
“或” 邏輯
使用 “|
” 來連結兩個欄位,提供 “或” 的邏輯。注意與括弧搭配使用
“非” 邏輯
如果在集合 “[...]
” 中使用字元 “^
”,則表示 “非”,如 “[^0-9]
” 等同於 “\D
”。
簡單的模式比對
以下是各種常用的單字元匹配列表:
指代類型 |
模式 |
備忘 |
數字 |
\d |
|
字母、數字、底線 |
\w |
等效於 “[_a-zA-Z0-9] ” |
非數字 |
\D |
|
非字母 |
\W |
|
定位字元 Tab |
\t |
|
Null 字元 |
\0 |
|
Backspace |
[\b] |
|
空格 |
\s |
等效於 “[ \t\n\r] ” |
Return |
\r |
|
換行 |
\n |
|
單詞之間的空白 |
\b |
這裡只是匹配單詞的開始 / 結束,不消耗任何字元 |
任意一個字元 |
. |
行結束符無法使用這個符號匹配 |
邊界
本小節設計一個概念:斷言,又稱為 “零寬度斷言(zero-width asseration)”。這個概念不匹配字元,而是匹配字串中的位置。
行的起始和結束
使用 “^
” 表示一行的開始
使用 “$
” 表示一行的終止
單詞邊界和非單詞邊界
比如要匹配單詞 “the”,則寫 “\bthe\b
”。如果要匹配哥哥中間帶 “e” 的單詞,則可以寫 “\Be\B
”
可以使用 “\<
” 匹配單詞開頭,“\>
” 匹配單詞結尾。但是這兩個並不建議使用,因為新的匹配器可能不支援。
Unicode 字元和其他字元
Regex支援輸入 unicode 的值,如 “\u00e9
”。注意 unicode 必須有四位十六進位位,大小寫均可。Javascript 還支援 “\xe9
” 的寫法,然而 “\x00e9
” 則是錯誤的。
相關推薦:
jsRegex驗證時間格式執行個體
Regex \v 元字元詳解
JSRegex要點分析