2011-10-26 19 views
0

林有一個漂亮的正則表達式生成器看起來像這樣:然後正則表達式C#密碼刪除空格

string numberOfDigits = "2"; 
string numberOfCaps = "2"; 
string numberOfChars = "3"; 
string numberOfNonAlpha = "3"; 
string minLength = "10"; 

string rexExString = "^(?=.*\\d{" + numberOfDigits + "})(?=.*[A-Z]{" + numberOfCaps + "})(?=.*[a-z]{" + numberOfChars + "})(?=.*[[email protected]#$%^&*()]{" + numberOfNonAlpha + "}).{" + minLength + ",}$"; 

輸出將是:

^(?=.*\d{2})(?=.*[A-Z]{2})(?=.*[a-z]{3})(?=.*[[email protected]#$%^&*()]{3}).{10,}$ 

這樣我可以指定多少個數字,字符,nonalpha等我想要我的密碼。我想保持這種方式。唯一的問題是它也接受空格,我不想爲我的密碼。

我的問題

如何不讓空格我正則表達式,但保持它的格式,所以我可以在上面的例子中指定的變量。

^(?=.*\d{2})(?=.*[A-Z]{2})(?=.*[a-z]{3})(?=.*[[email protected]#$%^&*()]{3}).{10,}$ 
+1

你的正則表達式強制兩個數字一起出現*一起*,與其他檢查類似 - 是否真的是你想要的?大多數密碼策略只是堅持字符數量,而不是它們發生的地方。 –

+0

你不應該使用'\ d'。你應該使用'[0-9]'。 '\ d'匹配非歐洲數字http://msdn.microsoft.com/en-us/library/w1c0s6bb.aspx – xanatos

回答

1

的問題是不是在你的格式的空間的問題是,你讓你的.{10,}所有的字符,在末尾。

嘗試此代替

\S{10,} 

\S不是空白(同[^\s]

順便說一句。你是否知道你想要在(?=.*\d{2})的序列中有兩個數字,而不是兩位數字?這意味着Foo1bar2不會被接受。

簡化這個怎麼辦?

把你的所有需求放到一個正則表達式中有點難。特別是如果你想允許在密碼中分配可配置數量的數字,而不是按順序分配。

爲什麼不分解此驗證過程。

您可以作爲第一步,檢查^\S{10,}$以確保密碼中至少有10個非空白字符。

然後你可以計算字符的類型,例如,像這樣:

MatchCollection uppercase = Regex.Matches(s, @"\p{Lu}"); 
MatchCollection lowercase = Regex.Matches(s, @"\p{Ll}"); 
MatchCollection digits = Regex.Matches(s, @"\p{N}"); 
MatchCollection nonAlpha = Regex.Matches(s, @"[\p{N}\p{L}]"); 

Console.WriteLine("Upper: " + uppercase.Count); 
Console.WriteLine("Lower: " + lowercase.Count); 
Console.WriteLine("Digits: " + digits.Count); 
Console.WriteLine("NonAlpha: " + nonAlpha.Count); 

只是比賽需要類的一個字符,然後開始使用MatchCollectioncount()方法這些字符的數量。

我在這裏使用了Unicode屬性(\p{...}),您可以輕鬆地將其更改爲所需的字符類。這是一個overview over the Unicode properties on regular-expressions.info

然後,您可以獲得每種字符類型的數量,並將其與您需要的特定類型的數量進行比較。

這將是一個更具可讀性和可維護性的功能。

+0

@Vincent Van Eijsden,我更新了我的答案。 – stema

+0

謝謝,我真的把所有東西都複製粘貼在一起,你的處理方式非常適合我的思維,謝謝。 –

1

而是到底用.{10,}$,你可以指定應該有ATLEAST 10個非空格字符\S{10,}$

\S{" + minLength + ",}$ 

注意大寫的S

1
Regex rx = new Regex(@"^((?<N>[0-9])|(?<CU>[A-Z])|(?<CL>[a-z])|(?<NA>[[email protected]#$%&*()^])|)*$(?<-N>){3}(?<-CU>){1}(?<-CL>){2}(?<-NA>){4}"); 

這個正則表達式使用平衡組來「積累」各種類型的字符。它會拒絕不在(這些組加空格)的字符。因此,例如è將被拒絕。如果要更改它,請將|)替換爲|.)

在字符串($)的末尾,它會檢查所有各種「堆棧」中是否有足夠的字符。很明顯,你看到{3}, {1}, {2}, {4}你必須把你的號碼。

請注意,這個正則表達式的有趣的事情是它可以爲1!A!a!2!b3工作。如果你想要各種類型的字符是連續的(所以123Abc!!!!),那麼這個正則表達式不是「好」。