这个正则怎么理解?

/(?=.*[A-Z])(?=.*[!@#$%&*()]).{8,}/.test(password)
阅读 1.6k
2 个回答
  • 必须包含大写字母
  • 必须包含 !@#$%&*() 中的一个
  • 至少 8 个字符(不含 \r\n

测试用例

const re = /(?=.*[A-Z])(?=.*[!@#$%&*()]).{8,}/
const passwords = [
  'A@aaaaaa', // true
  '@aaaaaaaA', // true
  'aaaaaaaa@A', // true
  'aaaa@aaaAaa', // true

  'aaaaaaaa', // false
  '@aaaaaaaa', // false
  'Aaaaaaaaa', // false
  'A@aaaaa', // false
]
for (password of passwords)
  console.log(re.test(password))

正则表达式手册(关键知识点:正向肯定预查)


匹配过程分析

假设正则表达式为 ^(?=.*[A-Z])(?=.*[!@#$%&*()]).{8,}$

首先从 0 的位置开始匹配 .*[A-Z],如果成功,再回到 0 的位置匹配 .*[!@#$%&*()],如果成功,再回到 0 的位置匹配 .{8,}$。关键在于回到 0 的位置,不是预查就不行

  1. 任意字符 + [A-Z] + 任意字符 + [!@#$%&*()] + 任意字符
  2. 8个及以上字符
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏