簡體   English   中英

2 個字母和 6 個數字的正則表達式

[英]Regular expression for 2 alphabets & 6 number

我有一個密碼規則要遵循,要求密碼必須包含 2 個字母(大寫或小寫)和 6 個數字,並且整個長度預計等於 8 個符號。

以下是應該通過的樣本:

a123456b
1a2b3456
aa123456
123ab456

以及應該失敗的樣本:

1abcdefg2
a1234567b
abcdefgh
12345678

我需要一個正則表達式來符合這個規則。

編輯:TL;DR:正則表達式不是這項工作的工具,這項工作不需要完成。

正則表達式不是問題的解決方案,AFAIK 不可能用它來解決您的問題。 (但不要相信我的話,我敢打賭有人為一個深奧的正則表達式引擎寫了一些時髦的擴展,就是這樣做的)

如果可能,解決方案將是不可讀的。 最好只檢查Count的結果。

類似的東西(實際上還沒有編譯這個):

bool IsPasswordValid(string pw)
{
    return pw.Length == 8 && 
            pw.Count(char.IsNumber) == 6 &&
            pw.Count(char.IsLetter) == 2;
}

注意事項

正則表達式是(是?)一種用於根據模式檢查字符串的工具。 模式越簡單,為它編寫正則表達式就越容易。 由於您希望您的密碼在字符串中的任何位置具有一組 2 個字符,並且在字符串中的任何位置也具有另一組的 6 個字符,因此創建這樣的模式非常困難(甚至不可能)。

如果您的問題是“我希望密碼以 2 位數字開頭並以 6 個字母結尾”,那么答案將是微不足道的,但由於數字和字母可以分開並位於字符串中的任何位置,因此它並不那么微不足道。

此外,大多數情況下,強制執行密碼模式並不能提高安全性。 如果您必須做任何事情,請強制執行合理的最小長度並就此停止。

正則表達式方法可以有多種,這里有 2 種:1) 需要 8 個字符的長度,並使用類似(?=.{8}$)的前瞻,並使用消費模式,允許在兩次字母前有零個或多個數字,然后匹配零個或多個字母,2) 匹配 8 個字母或數字,但使用先行限制來匹配 2 個字母。

示例 1:

^(?=.{8}$)(?:\d*[a-z]){2}\d*$

詳情

  • ^ - 字符串的開始
  • (?=.{8}$) - 長度只能是 8 個非換行符
  • (?:\\d*[az]){2} - 2 個 0+ 數字序列,后跟 1 個字母
  • \\d* - 0+ 位數
  • $ - 字符串的結尾。

查看正則表達式演示

示例 2:

^(?=(?:\d*[a-z]){2}\d*$)[\da-z]{8}$

詳情

  • ^ - 字符串的開始
  • (?=(?:\\d*[az]){2}\\d*$) - 必須有 2 個 0+ 數字序列和一個字母后跟 0+ 數字直到字符串末尾
  • [\\da-z]{8} - 8 位數字或字母
  • $ - 字符串的結尾。

參見正則表達式演示 2

請注意,要啟用不區分大小寫的模式,您可以在模式前加上(?i) / RegexOptions.IgnoreCase標志,如果您只需要匹配 ASCII 數字,請使用RegexOptions.ECMAScript或將\\d替換為[0-9]

實際上,有一個很好的方法來做到這一點:

    public static bool CheckPasswordRule(string password)
    {
        var isRuleAdhered = (Regex.Matches(password, "\\d").Count == 6 && Regex.Matches(password, "[a-z]").Count == 2);

        return isRuleAdhered;
    }

如果您仍然不想一個接一個地有6位數字,您可以將代碼修改為:

    public static bool CheckPasswordRule(string password)
    {
        var isRuleAdhered= false;
        isRuleAdhered = Regex.Matches(password, "\\d").Count == 6 && Regex.Matches(password, "[a-z]").Count == 2 && !Regex.IsMatch(password, "\\d{6}");
        return isRuleAdhered;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM