为什么忽略字符顺序的正则表达式不起作用?

时间:2017-06-07 16:47:24

标签: regex expression

我想创建一个字符串模式:

  1. 至少7个字符
  2. 至少有1位数,最多5位
  3. 至少有3个大写字母字符,最多5个
  4. 至少有1个较低的字母字符,最多5个
  5. 至少有1个特殊字符,最多5个
  6. 如何用正则表达式表达这个? 我可以做点像

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

    我不想要这种订单。事实上,任何混合订单都应该被接受,只需要字符数。

    此比赛:

    PASSW120P45ccb^&@%#
    

    但这个不是

    PA12S1SW2045ccb^&@%#
    

    我该如何解决这个问题?

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

    请查看https://regex101.com/r/vF2yO7/51

1 个答案:

答案 0 :(得分:1)

你需要使用相反的角色类操作,将它们放入非捕获组并重复这些

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

a demo on regex101.com

<小时/> 这里的结构总是相同的,例如使用数字:要求任何数字为零或更多次,后跟一个数字并重复整个模式1-5次。一般来说:

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

在上面的表达中,所有pos。前瞻符合此方案,[^...]否定了班级中要匹配的字符,\D*[^\d]*基本相同。