2015-11-26 47 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

相关问题