2021-12-18 04:08:38
Java正则表达式中的?:、?=、?!分别表示非捕获分组、正向预查和负向预查。
1. 非捕获分组 (?:)
(?:xox) 匹配 "xox" 但不保存分组值,反向引用(如1)无法引用它。
对比捕获分组 (xox) 会保存匹配值,可通过1引用。
2. 正向预查 (?=) 和负向预查 (?!)
示例:foo(?=bar) 匹配 "foobar" 中的 "foo",但结果仅包含 "foo"。
示例:foo(?!bar) 匹配 "fooxyz" 中的 "foo",但不匹配 "foobar"。
3. 强密码正则解析
(?=.*[0-9]):要求字符串中至少有一个数字(位置不限)。
(?=.*[a-z]):要求至少一个小写字母。
(?=.*[A-Z]):要求至少一个大写字母。
[0-9a-zA-Z]{8,16}:限制字符为字母数字,长度8-16。
特点:三个预查条件是“并列”的,不要求字符顺序(如 "A1bcdefg" 或 "1aBcdef" 均合法)。
4. 关键区别总结
示例验证:
通过理解这些符号的机制,可以更灵活地设计正则表达式,平衡匹配需求与性能优化。