我想创建一个字符串模式:
如何用正则表达式表达这个? 我可以做点像
^((?=.*[A-Z]{3,5})(?=.*[a-z]{1,5})(?=.*[0-9]{1,5})(?=.*[.~!@#$%^_&-]{1,5}))(?=.{7,20}).*$
我不想要这种订单。事实上,任何混合订单都应该被接受,只需要字符数。
此比赛:
PASSW120P45ccb^&@%#
但这个不是
PA12S1SW2045ccb^&@%#
我该如何解决这个问题?
P&@Ass120W45ccb^%#
P&@Ass20W45cb^%#
答案 0 :(得分:1)
你需要使用相反的角色类操作,将它们放入非捕获组并重复这些:
^
(?=(?:\D*\d){1,5})
(?=(?:[^A-Z]*[A-Z]){3,5})
(?=(?:[^a-z]*[a-z]){1,5})
(?=(?:[^.\~!@#$%^_&-]*[.\~!@#$%^_&-]){1,5})
.{7,20}
$
<小时/>
这里的结构总是相同的,例如使用数字:要求任何不数字为零或更多次,后跟一个数字并重复整个模式1-5次。一般来说:
(?=(?:not_what_you_want*what_you_want){min_times, max_times})
在上面的表达中,所有pos。前瞻符合此方案,[^...]
否定了班级中要匹配的字符,\D*
与[^\d]*
基本相同。