2015-11-26 43 views
1

我需要一個正則表達式來處理一個或多個小寫字母,一個或多個大寫字母,一個或多個數字以及正好一個特殊字符。正則表達式適用於一個或多個字母數字,並且正好有一個特殊字符

我寫了這個至今:

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\@\#\^])[a-zA-Z0-9\@\#\^]*$ 

它得到不止一個特殊字符。 順便說一下,我正在使用grep -P,並且我首先用http://regexr.com/測試了我的正則表達式。

我忘了提及角色應該以任何順序。

+0

猛砸正則表達式不要執行lookahead斷言。 – rici

+0

^我知道我使用grep -P,所以我可以使用lookaheads。 – ibz

+0

然後不要說你正在使用bash。假設你正在使用'grep -P'並避免讓人困惑。 – rici

回答

2

你的特殊字符分隔爲不同的字符類,只有匹配了一次:

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]*[\@\#\^][a-zA-Z0-9]*$ 
#NOTES:      ^you dont need to do a look ahead for the special char since you explicitly match only 1 

(?=...) ...    ) signifies lookaheads: they each check that there is at least 
one number, lowercase, and uppercase letter in the following match 
           [a-zA-Z0-9]* matches 0 or more of those for as long as possible 
              [\@\#\^] matches exactly one of these characters 
                [a-zA-Z0-9]* matches any of the remaining characters 

這工作比原來的更好,因爲它可以確保一個且只有一個,特殊字符匹配

+0

@RNar,如果你可以用RegEx解釋它的工作原理,那將是非常好的,而且非常有用。 – user3439894

+0

@ user3439894檢查編輯 –

+0

@RNar,很好,謝謝! +1 – user3439894

相關問題