寫個匹配郵箱的 RegExp 仇轻?
相信有很多人都遇到過這樣的需求:在頁面表單做一個對輸入郵箱字符串的合法性校驗。一般情況下疹鳄,不會正則表達式的小伙伴都是嘴角輕輕上揚硫兰,云淡風輕地在搜索引擎返回的結果列表中尋找自己想要的答案。對于一般的情況來說表蝙,網(wǎng)上的答案便足以應付PM的要求拴测。但是,當你遇上奇葩的PM和奇葩的需求時...
當然府蛇,匹配郵箱只是正則表達式的一個常見應用集索,它還可以延伸到匹配網(wǎng)址,匹配手機號汇跨,匹配特殊字符串等等务荆。正則表達式就如同一個多面過濾器,對被驗證的對象擁有者高度自定義和嚴格的校驗標準穷遂。不說精通函匕,至少能看懂并敲出簡單實用的正則表達式是任何一個碼農(nóng)要掌握的基本技能。立地看前端蚪黑,本文就正則表達式在 JS 中的基礎功能盅惜,對如何編寫正則表達式做一個記錄。
注意:
經(jīng)過我?guī)状螠y試忌穿,在 JS 中抒寂,直接寫出 RegExp 字面量形式的執(zhí)行速度要比調(diào)用 RegExp 對象構建快一些(個人實踐結果),因此文章統(tǒng)一是用字面量形式表示正則表達式掠剑。
在 JS 中表示正則表達式
我們都知道屈芜,在 JS 中正則表達式用字面量形式表示的語法為:
var reg1 = /pattern/attributes;
pattern 是一個字符串,表示匹配的模式朴译;
attributes 是 "g","i","m" 三個字符中的一個或多個井佑,稱為修飾符或者匹配屬性糕珊。
JS 是用斜杠符號/
把匹配模式包起來的,而里面的 pattern 模式就是要花力氣研究的東西毅糟。
中括號表達式 [ exp ]
中括號表達式 [ exp ](英文 exp 是 expression 表達式的縮寫)表示了匹配一個范圍內(nèi)的文本或字符串红选。譬如 [abc]
就是要匹配 "a"或者"b"或者"c"。它還支持這樣的寫法:
- [ abc ] : 查找方括號內(nèi)的任何字符
- [ ^abc ] : 查找不在方括號內(nèi)的任何字符姆另,也就是既不是"a"也不是"b"也不是"c"的字符
- [ 0-9 ] : 查找任何從 0 至 9 的數(shù)字
- [ a-z ] : 查找任何從小寫 a 到小寫 z 的字符
- [ A-Z ] : 查找任何從大寫 A 到大寫 Z 的字符
- [ A-z ] : 查找任何從大寫 A 到小寫 z 的字符
- [ adgk ] : 查找給定集合內(nèi)的任何字符
- [ ^adgk ] : 查找給定集合外的任何字符
舉例:我要檢測任意字符串中的大寫字母喇肋,要怎么寫呢?
var reg = /[A-Z]/; // 就這么簡單
var str = "abcX1289"
console.log(reg.exec(str)); // "X"
限定符
限定符用來指定正則表達式的一個給定組件必須要出現(xiàn)多少次才能滿足匹配迹辐。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6種蝶防。
- * : 匹配前面的子表達式零次或多次。例如明吩,zo* 能匹配 "z" 以及 "zoo"间学。* 等價于{0,}。
- + : 匹配前面的子表達式一次或多次印荔。例如低葫,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"仍律。+ 等價于 {1,}嘿悬。
- ? : 匹配前面的子表達式零次或一次。例如水泉,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 善涨。? 等價于 {0,1}。
- {n} : n 是一個非負整數(shù)草则。匹配確定的 n 次钢拧。例如,'o{2}' 不能匹配 "Bob" 中的 'o'炕横,但是能匹配 "food" 中的兩個 o源内。
- {n,} : n 是一個非負整數(shù)。至少匹配n 次看锉。例如姿锭,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o伯铣。'o{1,}' 等價于 'o+'。'o{0,}' 則等價于 'o*'轮纫。
- {n,m} : m 和 n 均為非負整數(shù)腔寡,其中n <= m。最少匹配 n 次且最多匹配 m 次掌唾。例如放前,"o{1,3}" 將匹配 "fooooood" 中的前三個 o忿磅。'o{0,1}' 等價于 'o?'。請注意在逗號和兩個數(shù)之間不能有空格凭语。
特別字符
- $ : 匹配輸入字符串的結尾位置葱她。如果設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'
- ( ) : 標記一個子表達式的開始和結束位置似扔。子表達式可以獲取供以后使用
- . : 匹配除換行符 \n之外的任何單字符
- \ : 將下一個字符標記為或特殊字符吨些、或原義字符、或向后引用炒辉、或八進制轉義符
- ^ : 匹配輸入字符串的開始位置豪墅,除非在方括號表達式中使用,此時它表示不接受該字符集合
- | : 指明兩項之間的一個選擇
- \w : 查找單詞字符
- \W : 查找非單詞字符
- \d : 查找數(shù)字
- \D : 查找非數(shù)字字符
- \s : 查找空白字符
- \S : 查找非空白字符
- \b : 匹配單詞邊界
- \B : 匹配非單詞邊界
- \n : 查找換行符
- \r : 查找回車符
總結
今天在這里是稍微總結了下正則表達式的基本知識黔寇,簡單的正則是能寫了偶器,能看了。但是要深入了解正則表達式并且高效運用缝裤,還早著呢F梁洹?所以下一篇有關正則的文章題目應該就是“深入探索正則表達式的運用”憋飞。
不過亭枷,這個我感覺急不來,得有時間學搀崭,有時間寫才行叨粘。