對於正則這個東西,對我來說一直是很懵逼的,每次用每次查,然後還是記不住,這次又要在參數上加格式驗證了,改了幾次,改的心力憔悴,這次又一點一點的從語法開始自己拼寫的正則貌似好使了,記錄一下。
首先來從基本語法符號開始:
^
表示匹配字符串的開始位置 (例外 用在中括號中[ ] 時,可以理解爲取反,表示不匹配括號中字符串)$
表示匹配字符串的結束位置*
表示匹配 零次到多次+
表示匹配 一次到多次 (至少有一次)?
表示匹配零次或一次.
(圓點)表示匹配單個字符|
表示爲或者,兩項中取一項(可用於兩個正則之間)( )
小括號表示匹配括號中全部字符[ ]
中括號表示匹配括號中一個字符 範圍描述 如[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_$
暫時就這麼多了,以後用得着的,再擴展。