首頁 > 軟體

Java正則校驗密碼至少包含字母數位特殊符號中的2種範例程式碼

2022-08-02 14:06:53

一、語法

字元說明
將下一字元標記為特殊字元、文字、反向參照或八進位制跳脫符。例如, n匹配字元 nn 匹配換行符。序列 \\ 匹配 \\( 匹配 (
^匹配輸入字串開始的位置。如果設定了 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 _是非負整數。正好匹配 n 次。例如,"o{2}"與"Bob"中的"o"不匹配,但與"food"中的兩個"o"匹配。
{n,}_n _是非負整數。至少匹配 _n _次。例如,"o{2,}“不匹配"Bob"中的"o”,而匹配"foooood"中的所有 o。"o{1,}“等效於"o+”。"o{0,}“等效於"o*”。
{n,m}m 和 n 是非負整數,其中 n <= m。匹配至少 n 次,至多 m 次。例如,"o{1,3}"匹配"fooooood"中的頭三個 o。‘o{0,1}’ 等效於 ‘o?’。注意:您不能將空格插入逗號和數位之間。
?當此字元緊隨任何其他限定符(*、+、?、{n}、{n,}、{n,m})之後時,匹配模式是"非貪心的"。"非貪心的"模式匹配搜尋到的、儘可能短的字串,而預設的"貪心的"模式匹配搜尋到的、儘可能長的字串。例如,在字串"oooo"中,"o+?“只匹配單個"o”,而"o+“匹配所有"o”。

二、正則實戰

1、純字母

"[a-zA-Z]{1,}$"

2、純數位

"[0-9]{1,}$"

3、字母和數位組合

"((^[a-zA-Z]{1,}[0-9]{1,}[a-zA-Z0-9]*)+)|((^[0-9]{1,}[a-zA-Z]{1,}[a-zA-Z0-9]*)+)$"

4、字母或數位

"[a-zA-Z0-9]+$"

5、字母、數位、下劃線,都可以

"\w+$"

6、字母、數位、特殊符號,至少匹配2種

/**
     * 假定設定密碼時,密碼規則為:  字母、數位、特殊符號,至少匹配2種
     * 則密碼可能出現的情況有:
     * 1、數位+特殊符號
     * 2、字母+特殊符號
     * 3、字母+數位
     * 4、字母+數位+特殊符號
     * (組合與順序無關)
     * 解決思路:
     * 1、遍歷字串的字元陣列,檢視是否包含目標特殊字元,若包含,則標記字串
     * 包含特殊字元,並替換當前特殊字元為''。
     * 2、判斷剩下的字元組成的字串,是否匹配以下情況
     * - 純字母
     * - 純數位
     * - 字母+數位
     * 3、字串匹配規則
     * 純字母+包含特殊字元  ---- 匹配通過
     * 純數位+包含特殊字元 ---- 匹配通過
     * 字母+數位+包含個數位符 ---- 匹配通過
     */
    //特殊字元
    public static final String SPEC_CHARACTERS = " !"#$%&'()*+,-./:;<=>?@\]\[^_`{|}~";
    // 純字母
    public static final String character = "[a-zA-Z]{1,}$";
    // 純數位
    public static final String numberic = "[0-9]{1,}$";
    // 字母和數位
    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]*)+)$";
    // 字母或數位
    public static final String number_or_character = "[a-zA-Z0-9]+$";
    // 字母數位下劃線
    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 + ",是否符合規則:" + 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%^&*");
    }

測試結果:

附:密碼中允許出現數位、大寫字母、小寫字母,但至少包含其中2種且長度在8-16之間(三種符號任取其二)

  • 包含三種符號中的一種符號,無效。
  • 包含三種符號中的二種符號,有效。
  • 包含三種符號中的三種符號,有效。

正向否定方式:

^(?![d]+$)(?![a-z]+$)(?![A-Z]+$)[da-zA-z]{8,16}$
  • (?![d]+$):正向否定查詢。匹配向後直到結尾均為數位的字元。
  • ^(?![d]+$)(?![a-z]+$)(?![A-Z]+$):匹配向後直到結尾既不是純數位,又不是純訊息字母,又不是純大寫字母的開始字元。
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

這個表示式也可以實現相同的功能

^(?!^(d+|[a-z]+|[A-Z]+)$)[da-zA-Z]{8,16}$
  • ^(d+|[a-z]+|[A-Z]+)$:從頭到尾要麼是純數位,要麼是純小寫字母,要麼是純大寫字母。
  • ^(?!^(d+|[a-z]+|[A-Z]+)$):匹配向後直到結尾既不是純數位,又不是純訊息字母,又不是純大寫字母的開始字元。

總結 

到此這篇關於Java正則校驗密碼至少包含字母數位特殊符號中的2種的文章就介紹到這了,更多相關Java正則校驗密碼內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com