^(?=.*[A-Z])
^ - 匹配字符串开始位置
(?= ... ) - 正向先行断言,表示"在这个位置之后,必须满足括号内的条件"
.[A-Z] - 任意字符(.)出现0次或多次(),后面跟着一个大写字母([A-Z])
从字符串开头开始,后面必须存在至少一个大写字母(但不消耗字符,只是检查)
php
// ✅ 匹配成功(有字母)
"ABC-123" // 有 A、B、C
"X-9" // 有 X
"TEST-PN" // 有 T、E、S
// ❌ 匹配失败(没有字母)
"123-456" // 只有数字和-
"---" // 只有-
"123" // 只有数字
只是检查,不移动匹配位置 - 断言通过后,匹配位置仍在开头
不消耗字符 - 它只是"看一眼"后面有没有符合条件的字符
配合后面的 [-A-Z0-9]+$ - 先检查有字母,再检查所有字符都是字母/数字/连字符
对于字符串 "ABC-123":
^ - 在位置0
(?=.*[A-Z]) - 检查后面有没有字母?有(A),通过
[-A-Z0-9]+$ - 开始匹配:A、B、C、-、1、2、3 都符合要求,成功
php
// 至少一个小写字母
'^(?=.*[a-z])'
// 至少一个字母(不区分大小写)
'^(?=.*[a-zA-Z])'
// 至少一个数字
'^(?=.*\d)'
// 至少一个特殊字符
'^(?=.*[!@#$%])'
这种模式常用于密码强度验证,要求同时包含多种类型的字符。