这个正则怎么理解?

/(?=.*[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个及以上字符
宣传栏