[英]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 位數字或字母$
- 字符串的結尾。 請注意,要啟用不區分大小寫的模式,您可以在模式前加上(?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.