Java正則校驗密碼至少包含字母數(shù)字特殊符號中的2種實例代碼
更新時間:2022年08月02日 10:50:35 作者:CoreCmd
正則表達式驗證密碼功能在項目中經(jīng)常被使用到,但是很多朋友還是不大會使用密碼正則表達式進行驗證,下面這篇文章主要給大家介紹了關于Java正則校驗密碼至少包含字母數(shù)字特殊符號中2種的相關資料,需要的朋友可以參考下
一、語法
| 字符 | 說明 |
|---|---|
| \ | 將下一字符標記為特殊字符、文本、反向引用或八進制轉義符。例如, n匹配字符 n。\n 匹配換行符。序列 \\\\ 匹配 \\ ,\\( 匹配 (。 |
| ^ | 匹配輸入字符串開始的位置。如果設置了 RegExp 對象的 Multiline 屬性,^ 還會與"\n"或"\r"之后的位置匹配。 |
| $ | 匹配輸入字符串結尾的位置。如果設置了 RegExp 對象的 Multiline 屬性,$ 還會與"\n"或"\r"之前的位置匹配。 |
| * | 零次或多次匹配前面的字符或子表達式。例如,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ù)字之間。 |
| ? | 當此字符緊隨任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后時,匹配模式是"非貪心的"。"非貪心的"模式匹配搜索到的、盡可能短的字符串,而默認的"貪心的"模式匹配搜索到的、盡可能長的字符串。例如,在字符串"oooo"中,"o+?“只匹配單個"o”,而"o+“匹配所有"o”。 |
二、正則實戰(zhàn)
1、純字母
"[a-zA-Z]{1,}$"
2、純數(shù)字
"[0-9]{1,}$"3、字母和數(shù)字組合
"((^[a-zA-Z]{1,}[0-9]{1,}[a-zA-Z0-9]*)+)|((^[0-9]{1,}[a-zA-Z]{1,}[a-zA-Z0-9]*)+)$"4、字母或數(shù)字
"[a-zA-Z0-9]+$"
5、字母、數(shù)字、下劃線,都可以
"\\w+$"
6、字母、數(shù)字、特殊符號,至少匹配2種
/**
* 假定設置密碼時,密碼規(guī)則為: 字母、數(shù)字、特殊符號,至少匹配2種
* 則密碼可能出現(xiàn)的情況有:
* 1、數(shù)字+特殊符號
* 2、字母+特殊符號
* 3、字母+數(shù)字
* 4、字母+數(shù)字+特殊符號
* (組合與順序無關)
* 解決思路:
* 1、遍歷字符串的字符數(shù)組,查看是否包含目標特殊字符,若包含,則標記字符串
* 包含特殊字符,并替換當前特殊字符為''。
* 2、判斷剩下的字符組成的字符串,是否匹配以下情況
* - 純字母
* - 純數(shù)字
* - 字母+數(shù)字
* 3、字符串匹配規(guī)則
* 純字母+包含特殊字符 ---- 匹配通過
* 純數(shù)字+包含特殊字符 ---- 匹配通過
* 字母+數(shù)字+包含個數(shù)字符 ---- 匹配通過
*/
//特殊字符
public static final String SPEC_CHARACTERS = " !\"#$%&'()*+,-./:;<=>?@\\]\\[^_`{|}~";
// 純字母
public static final String character = "[a-zA-Z]{1,}$";
// 純數(shù)字
public static final String numberic = "[0-9]{1,}$";
// 字母和數(shù)字
public static final String number_and_character = "((^[a-zA-Z]{1,}[0-9]{1,}[a-zA-Z0-9]*)+)" +
"|((^[0-9]{1,}[a-zA-Z]{1,}[a-zA-Z0-9]*)+)$";
// 字母或數(shù)字
public static final String number_or_character = "[a-zA-Z0-9]+$";
// 字母數(shù)字下劃線
public static final String ncw = "\\w+$";
public static boolean checkPassword(String targetString) {
String opStr = targetString;
boolean isLegal = false;
boolean hasSpecChar = false;
char[] charArray = opStr.toCharArray();
for (char c : charArray) {
if (SPEC_CHARACTERS.contains(String.valueOf(c))) {
hasSpecChar = true;
// 替換此字符串
opStr = opStr.replace(c, ' ');
}
}
String excSpecCharStr = opStr.replace(" ", "");
boolean isPureNum = Pattern.compile(numberic).matcher(excSpecCharStr).matches();
boolean isPureChar = Pattern.compile(character).matcher(excSpecCharStr).matches();
boolean isNumAndChar = Pattern.compile(number_and_character).matcher(excSpecCharStr).matches();
isLegal = ((isPureNum && hasSpecChar)
|| (isPureChar && hasSpecChar) || isNumAndChar && hasSpecChar) || isNumAndChar;
System.out.println("字符串:" + targetString + ",是否符合規(guī)則:" + isLegal);
System.out.println("---------------");
return isLegal;
}
public static void main(String[] args) {
checkPassword("fasdagd");
checkPassword("41234123");
checkPassword("#$%^&&*(");
checkPassword("fasd$$");
checkPassword("41234%%%");
checkPassword("fasd41^(324");
checkPassword("fa413%^&*");
checkPassword("&%fa413%^&*");
}測試結果:

附:密碼中允許出現(xiàn)數(shù)字、大寫字母、小寫字母,但至少包含其中2種且長度在8-16之間(三種符號任取其二)
- 包含三種符號中的一種符號,無效。
- 包含三種符號中的二種符號,有效。
- 包含三種符號中的三種符號,有效。
正向否定方式:
^(?![\d]+$)(?![a-z]+$)(?![A-Z]+$)[\da-zA-z]{8,16}$
- (?![\d]+$):正向否定查找。匹配向后直到結尾均為數(shù)字的字符。
- ^(?![\d]+$)(?![a-z]+$)(?![A-Z]+$):匹配向后直到結尾既不是純數(shù)字,又不是純消息字母,又不是純大寫字母的開始字符。
console> console.log(/^(?![\d]+$)(?![a-z]+$)(?![A-Z]+$)[\da-zA-z]{8,16}$/g.test("abcdefgh"));
false
console> console.log(/^(?![\d]+$)(?![a-z]+$)(?![A-Z]+$)[\da-zA-z]{8,16}$/g.test("abcdefgH"));
true
console> console.log(/^(?![\d]+$)(?![a-z]+$)(?![A-Z]+$)[\da-zA-z]{8,16}$/g.test("abcdefg8"));
true
console> console.log(/^(?![\d]+$)(?![a-z]+$)(?![A-Z]+$)[\da-zA-z]{8,16}$/g.test("abcdefG8"));
true
console> console.log(/^(?![\d]+$)(?![a-z]+$)(?![A-Z]+$)[\da-zA-z]{8,16}$/g.test("12345678"));
false
console> console.log(/^(?![\d]+$)(?![a-z]+$)(?![A-Z]+$)[\da-zA-z]{8,16}$/g.test("12345678a"));
true
這個表達式也可以實現(xiàn)相同的功能
^(?!^(\d+|[a-z]+|[A-Z]+)$)[\da-zA-Z]{8,16}$- ^(\d+|[a-z]+|[A-Z]+)$:從頭到尾要么是純數(shù)字,要么是純小寫字母,要么是純大寫字母。
- ^(?!^(\d+|[a-z]+|[A-Z]+)$):匹配向后直到結尾既不是純數(shù)字,又不是純消息字母,又不是純大寫字母的開始字符。
總結
到此這篇關于Java正則校驗密碼至少包含字母數(shù)字特殊符號中的2種的文章就介紹到這了,更多相關Java正則校驗密碼內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java微信公眾號開發(fā)(搭建本地測試環(huán)境)
這篇文章主要介紹了java微信公眾號開發(fā),主要內容有測試公眾號與本地測試環(huán)境搭建,需要的朋友可以參考下2015-12-12
Java與Node.js利用AES加密解密出相同結果的方法示例
這篇文章主要介紹了Java與Node.js利用AES加密解密出相同結果的方法,文中給出了詳細的示例代碼,相信對大家的學習或者工作能帶來一定的幫助,需要的朋友們下面來一起看看吧。2017-02-02
基于@AllArgsConstructor與@Value共用的問題解決
這篇文章主要介紹了基于@AllArgsConstructor與@Value共用的問題解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
詳解如何使用MongoDB+Springboot實現(xiàn)分布式ID的方法
這篇文章主要介紹了詳解如何使用MongoDB+Springboot實現(xiàn)分布式ID的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-09-09
FasfDFS整合Java實現(xiàn)文件上傳下載功能實例詳解
這篇文章主要介紹了FasfDFS整合Java實現(xiàn)文件上傳下載功能實例詳解,需要的朋友可以參考下2017-08-08

