@Pattern註解中常用的校驗正則表達式札記

1 前端傳參要求

    項目開發中經常會遇到對用戶輸入內容的限制,本篇對常用限制做一總結。如下圖所示,標識字段有嚴格命名限制,用戶輸入校驗這部分工作前端可以做,當然後端也可以通過在DTO中添加註解的方式實現參數校驗。其底層原理還是攔截器攔截請求,對帶有相關注解的屬性字段進行處理(非空、大小、長度、內容等判斷)
用戶新建項目示意圖

    DTO中代碼如下:

@Data
public class ProjectDTO {

    @NotBlank(message = "項目名不能爲空")
    private String name;

    private String desc;

    @NotBlank(message = "項目標識符不得爲空")
    @Pattern(regexp = "[a-z0-9_\\-]{1,100}", message = "僅小寫字母(a-z)、數字、破折號(-)和下劃線(_)可以使用,且長度最長爲100,最短爲1")
    private String identifier;

    private boolean isPublic;

    /***
     * 移動號段: 134 135 136 137 138 139 147 148 150 151 152 157 158 159 165 172 178 182 183 184 187 188 198
     * 聯通號段: 130 131 132 145 146 155 156 166 170 171 175 176 185 186
     * 電信號段: 133 149 153 170 173 174 177 180 181 189 191 199
     * 虛擬運營商: 170
     */
    @Pattern(regexp = "^((13[0-9])|(14[5,6,7,9])|(15[^4])|(16[5,6])|(17[0-9])|(18[0-9])|(19[1,8,9]))\\d{8}$", message = "invalid phone number")
    private String phone;

}

    有時系統對用戶名的命名有諸多要求,比如用戶名必須要有一個小寫字母,一個大寫字母和一個數字,並且是6-20位,正則表達式如下:

@Pattern(regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[A-Za-z0-9]{6,20}$", message = "用戶名錯誤")

2 其他常用表達式

2.1 數字校驗

整數或者小數:"^[0-9]+\.{0,1}[0-9]{0,2}$"
只能輸入數字:"^[0-9]*$"
只能輸入n位的數字:"^\d{n}$"
只能輸入至少n位的數字:"^\d{n,}$"
只能輸入m~n位的數字:"^\d{m,n}$"
只能輸入零和非零開頭的數字:"^(0|[1-9][0-9]*)$"
只能輸入有兩位小數的正實數:"^[0-9]+(.[0-9]{2})?$"
只能輸入有1~3位小數的正實數:"^[0-9]+(.[0-9]{1,3})?$"
只能輸入非零的正整數:"^\+?[1-9][0-9]*$"
只能輸入非零的負整數:"^^-[1-9]+[0-9]*$"

2.2 字符串校驗

只能輸入長度爲3的字符:"^.{3}$"。
只能輸入由26個英文字母組成的字符串:"^[A-Za-z]+$"
只能輸入由26個大寫英文字母組成的字符串:"^[A-Z]+$"
只能輸入由26個小寫英文字母組成的字符串:"^[a-z]+$"
只能輸入由數字和26個英文字母組成的字符串:"^[A-Za-z0-9]+$"
只能輸入由數字、26個英文字母或者下劃線組成的字符串:"^\w+$"

2.3 月份時間校驗

驗證一年的12個月:"^(0?[1-9]|1[0-2])$"    //格式爲:"01"~"09"和"1"~"12"。
驗證一個月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"  //格式爲;"01"~"09"和"1"~"31"。

2.4 Email校驗

這部分由於各種域名郵箱的多樣性,需要特殊情況特殊對待,限制可以做的嚴格也可以寬鬆
舉例:zhangsan_123@cetc.com.cn

分析郵件名稱部分:
   字母和數字表示爲A-Za-z0-9 
   下劃線表示爲_
   中劃線表示爲-
   由於名稱是由若干個字母、數字、下劃線和中劃線組成,所以需要用到+表示多次出現
   通過分析得出郵件名稱部分表達式爲[a-zA-Z0-9_-]+

分析域名部分:
   一般域名的規律爲“[N級域名][三級域名.]二級域名.頂級域名”,比如"qq.com""www.qq.com""mp.weixin.qq.com""12-34.com.cn",分析可得域名類似"** .** .** .**"組成。
   "**"部分可以表示爲[a-zA-Z0-9_-]+
   ".**"部分可以表示爲\.[a-zA-Z0-9_-]+
   多個".**"可以表示爲(\.[a-zA-Z0-9_-]+)+
   綜上所述,域名部分可以表示爲[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+
   
最終表達式: 
 我們用@符號將郵箱的名稱和域名拼接起來,因此完整的郵箱表達式爲 
  ^[A-Za-z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$

驗證Email: "^[A-Za-z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$"

2.5 漢字校驗

只能輸入漢字:"^[\u4e00-\u9fa5]{0,}$"

匹配中文字符的正則表達式:"[\u4e00-\u9fa5]"

2.6 URL校驗

未校驗漢字
驗證URL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"or
"(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]"

2.7 固定電話校驗

電話號碼:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"  
//格式爲:"XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章