2017-06-07 52 views
0

我想打一個字符串模式是:爲什麼我的正則表達式忽略字符順序不起作用?

  1. 至少7長
  2. 至少有1個數字字符,最多5
  3. 至少有3個資本字母,最多5
  4. 至少有1個低字母,最多5
  5. 至少有1個特殊字符,最多5

如何用正則表達式來表達這一點? 我可以這樣做

^((?=.*[A-Z]{3,5})(?=.*[a-z]{1,5})(?=.*[0-9]{1,5})(?=.*[[email protected]#$%^_&-]{1,5}))(?=.{7,20}).*$ 

我不想要求這樣的順序。實際上,任何混合順序都應該被接受,只需要字符數。

本場比賽:

PASSW120P45ccb^&@%# 

但是這一次不

PA12S1SW2045ccb^&@%# 

我怎麼能解決這個問題?

P&@Ass120W45ccb^%# 
P&@Ass20W45cb^%# 

請看看https://regex101.com/r/vF2yO7/51

回答

1

您需要用相反字符類操作,把這些成非捕獲組和重複這些

^ 
(?=(?:\D*\d){1,5}) 
(?=(?:[^A-Z]*[A-Z]){3,5}) 
(?=(?:[^a-z]*[a-z]){1,5}) 
(?=(?:[^.\[email protected]#$%^_&-]*[.\[email protected]#$%^_&-]){1,5}) 
.{7,20} 
$ 

a demo on regex101.com


這裏的結構總是相同的,例如用數字表示:要求任何東西 不是數字零次或多次,然後是數字並重復整個模式1-5次。一般情況下:

(?=(?:not_what_you_want*what_you_want){min_times, max_times}) 

在上面的表達式中,所有pos。 lookaheads follow this scheme,[^...]否定要匹配的字符,\D*[^\d]*基本相同。

相關問題