Java 註解@Pattern 參數驗證------正則驗證

對於正則這個東西,對我來說一直是很懵逼的,每次用每次查,然後還是記不住,這次又要在參數上加格式驗證了,改了幾次,改的心力憔悴,這次又一點一點的從語法開始自己拼寫的正則貌似好使了,記錄一下。

首先來從基本語法符號開始:

  • ^ 表示匹配字符串的開始位置 (例外 用在中括號中[ ] 時,可以理解爲取反,表示不匹配括號中字符串)
  • $ 表示匹配字符串的結束位置
  • * 表示匹配 零次到多次
  • + 表示匹配 一次到多次 (至少有一次)
  • ? 表示匹配零次或一次
  • . (圓點)表示匹配單個字符
  • | 表示爲或者,兩項中取一項(可用於兩個正則之間)
  • ( ) 小括號表示匹配括號中全部字符
  • [ ] 中括號表示匹配括號中一個字符 範圍描述 如[0-9 a-z A-Z]
  • { } 大括號用於限定匹配次數 如 {n}表示匹配n個字符 {n,}表示至少匹配n個字符 {n,m}表示至少n,最多m
  • \ 轉義字符 如上基本符號匹配都需要轉義字符 如 \*表示匹配*號
  • \w 表示英文字母和數字 \W 非字母和數字
  • \d 表示數字 \D 非數字
  • \s表示空字符串
  • 當使用-時,需要放在最後一個位置,否則會被當成數字和字母之間區間的標識

語法規則貌似很簡單的嘛,用的時候直接按照規則拼就完事了,試試看吧。



下面是我使用的demo,測了一下目前沒發現什麼問題:

首先是首尾匹配,那麼就要使用^$,使用*或者\的時候,就要使用轉義字符了(下面是在java中使用的,轉義符號需要兩個斜槓配合使用纔好使)。

然後是長度限制時,可以使用大括號{ } {n}表示匹配n個字符 {n,}表示至少匹配n個字符 {n,m}表示至少n,最多m

數字和字母組合可爲空字符串 :@Pattern(regexp = "^\\s*|[0-9A-Za-z]*$", message = "編號爲數字和字母組合")

聯繫電話:@Pattern(regexp = "^[\\d\\*]{7,12}$", message = "聯繫電話輸入有誤") 由於區號分爲3位和四位的,然後座機號碼又分爲7位和8位的,所以這裏校驗的長度是7-12位,並且這裏添加了*表示脫敏的手機號仍然可以通過校驗。

中英文非空字符串(可屏蔽emoji表情):@Pattern(regexp = "^[\\u0391-\\uFFE5\\w]+$", message = "名稱含有特殊字符")

網址:@Pattern(regexp = "^[http://]?([\\w]+\\.)+[\\w]+(/[\\w.\\w/?%&=]*)?", message = "網址輸入有誤")

@Pattern遇到BigDecimal 就不好使了,當參數類型是BigDecimal,在參數上使用@Pattern時就報錯了,提示@Pattern中沒有這個驗證BigDecimal的方法。
於是我就另外寫了一個方法,單獨驗證BigDecimal類型的數值。

    /**
     * 校驗Decimal類型的數值
     * @param obj
     * @return
     */
    public static boolean judgeTwoDecimal(Object obj) {
        boolean flag = false;
        try {
            if (obj != null) {
                String source = obj.toString();
                // 判斷是否是整數或者是攜帶一位或者兩位的小數
                Pattern pattern = Pattern.compile("^[+]?([0-9]{0,16}(.[0-9]{1,2})?)$");
                if (pattern.matcher(source).matches()) {
                    flag = true;
                }
            }
        } catch (Exception e) {
            e.getMessage();
        }
        return flag;
    }

密碼:長度爲6-32位,並且必須包含數字、字母、特殊符號中的至少兩種:@Pattern(regexp = "^(?=.*[a-zA-Z0-9].*)(?=.*[a-zA-Z.!@#$%^&*].*)(?=.*[0-9.!@#$%^&*].*).{6,32}$", message = "密碼至少包含數字,字母和符號的兩種")



貼幾個網上找的正則,貌似大概看得懂,然後還會有點用處的demo

帳號(字母開頭,允許5-16字節,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

中文、英文、數字及下劃線:^[\u4e00-\u9fa5_a-zA-Z0-9]+$

中文:^[\u0391-\uFFE5]+$ (這裏使用了+表示至少一個,即是非空且只能中文,可空時+可改爲*)

郵政編碼:^[1-9]\d{5}$ 首尾的匹配就不說了,郵政編碼爲6位,首部已經匹配了一位了,剩餘5位,於是用{5}

手機號碼:^((\d2,3)|(\d{3}\-))?13\d{9}$ 感覺這個是有問題的,首先是表示零次或一次,問號前面表示電話的前綴,後面13表示匹配13開頭的手機號,現在手機號已經有很多種開頭的了,匹配手機號開頭的話,13換成1\d{1}會更好,\d{9}表示9位數字,那麼這個正則當輸入一個15位的數字串也是可以通過的(只是猜測,沒有驗證)。

英文字符數字串:^[A-Za-z0-9]+$ ,這個比較簡單明瞭,我使用的也是這個,\w也是等效的,我還沒試過。

英文數字加下劃線串:^\w_$

暫時就這麼多了,以後用得着的,再擴展。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章