2015-11-26 3 views
1

Мне нужна помощь с регулярным выражением для 1 или более строчных букв, 1 или более прописных букв, 1 или более цифр и ровно 1 специальный символ.Регулярное выражение для 1 или более цифр букв и только один специальный символ

я написал до сих пор:

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

Он получает более чем один специальный символ. Кстати, я использую grep -P, и я сначала тестирую свое регулярное выражение с http://regexr.com/.

Я забыл упомянуть, что персонажи должны быть в любом порядке.

+0

Bash регулярных выражений не реализуйте утверждения lookahead. – rici

+0

^i знаю im используя 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 проверить edit –

+0

@RNar, это приятно, спасибо! +1 – user3439894

Смежные вопросы