1. 程式人生 > >常用正則表示式(手機號、郵箱、URL地址、身份證等等)

常用正則表示式(手機號、郵箱、URL地址、身份證等等)

一、前言

  不好的習慣:1、每一次用到正則都是上網copy一份,也沒有去學習思考,看看都是什麼意思;

        2、一個專案裡不同的地方用到了相同的校驗,一直在重複的copy程式碼,並沒有統一起來,萬一哪天要修改規則,若是多人開發,每個人的正則校驗不盡相同,改起來就很麻煩。

  先記錄一下,後續慢慢學習,最後自己能看懂並會寫常用的正則。

二、正則基本知識點

  1、橫向模糊匹配{}:

    一個正則可以匹配的字串的長度不是固定的,使用量詞可以達到這種目的。

    量詞:比如{m , n} :表示連續出現最少 m 次,最多 n 次;跟在一個字元的後面就表示對該字元的限定。

    比如郵箱的校驗:/^\w+@[a-z0-9]+\.[a-z]{2,4}$/,寫在了[a-z]後面,表示可以有2到4位的字母;

    比如手機號的校驗: /^1[3456789]\d{9}$/,跟在了\d後面,表示需要出現9個數字       

{m , n} :表示連續出現最少 m 次,最多 n 次
{m , }   :表示至少出現m次
{m}      :表示出現m次
?      :等價於{0,1} 表示出現或不出現
+        :等價於{1,} 表示至少出現1次
*        :等價於{0,} 表示出現任意次,可以不出現

    比如郵箱的校驗:/^\w+@[a-z0-9]+\.[a-z]{2,4}$/,寫在了[a-z0-9]後面,可以出現0到9或者字母a-z的任意一個,至少一次

  2、縱向模糊匹配[]:

    正則匹配的字串對於某一位置上的字元來說,它可以有多種可能,不侷限於某一型別,使用字元組可以達到這種目的。

    字元組:比如[abc],表示該字元是可以字元 "a"、"b"、"c" 中的任何一個。對於這一位置來說,我們可以有3種可能性。

    比如手機號的校驗: /^1[3456789]\d{9}$/,它在第二個位置,根據一般手機運營商來說,提供手機第二位的數字可以是3到9的任意一個,才符合規範。

    如果字元組裡表示的字元特別多,可以使用範圍表示法,用連字元-來省略和縮寫。

    比如郵箱的校驗:/^\w+@[a-z0-9]+\.[a-z]{2,4}$/,它跟在@後面,根據我們郵箱的規範可知,@後面需要的是0到9或者字母a-z的任意一個

  3、常用的簡寫形式

    \d  :表示[0-9],表示一位數字
    \D  :表示[^0-9],表示除數字外的任意字元
    \w  :表示[0-9a-zA-Z_],表示數字、大小寫字母和下劃線
    \W  :表示[^0-9a-zA-Z_],非單詞字元

    比如手機號的校驗: /^1[3456789]\d{9}$/,結合後面的量詞,\d在第三位,表示從第三位起,一共9位都是數字

三、表單常用

  可以把一個專案裡用到的校驗規則寫在一個工具類裡,這樣可以保證一個專案裡對同一個東西的校驗是統一的,不用重複多餘的堆砌程式碼。

 

class Validator {
    //身份證校驗
    idCard(val){
        return /(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{7}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$)/.test(val)
    }
    
    //手機號校驗
    phnoe(val){
        return /^1[3456789]\d{9}$/.test(val)
    }
    
    //郵箱
    email(val){
        return /^\w+@[a-z0-9]+\.[a-z]{2,4}$/.test(val)
    }
    
    //普通護照
    passport(val){
        return /^((1[45]\d{7})|(G\d{8})|(P\d{7})|(S\d{7,8}))?$/.test(val)
    }
    
    //臺胞證
    taiwanID(val){
        return /^[a-zA-Z][0-9]{9}$/.test(val)
    }
    //港澳身份證
    hkId(val){
        return /^([A-Z]\d{6,10}(\w1)?)$/.test(val)
    }
    
    //中文
    chineseWord(val){
        return  /^[\u4e00-\u9fa5]*$/.test(val)
    }
    
    //密碼(不能是純數字或字母)
    psdRxp(val){
        const numberRegexp = /^\d+$/;
        const letterRegexp = /^[a-zA-Z]+$/;
        return numberRegexp.test(val) || letterRegexp.test(val)
    }
}
export default new Validator();

 

參考書目:《javascript正則表示式迷你