正则表达式 高级特性(贪婪与断言)
正则表达式 高级特性
贪婪与非贪婪匹配
默认情况下是贪婪匹配的,即尽可能多地匹配
- 在量词后面加上
?变为非贪婪匹配
示例:
对于字符串"aabab"
- 默认贪婪匹配
a.*b
匹配结果:
aabab
- 非贪婪匹配, 尽可能少匹配
a.*?b
匹配结果:
aab ab
零宽断言
断言是正则表达式中用于指定匹配位置的元字符,他们不匹配任何实际字符,而是匹配字符之间的位置。
特点:
- 零宽度:不占用匹配字符的位置
- 条件检查:只检查是否满足特定条件
- 不影响匹配结果:仅作为匹配的约束条件
断言类型
| 断言 | 说明 | 示例 |
|---|---|---|
?=exp |
正向先行断言,检查当前位置之后是否匹配特定模式 | (ab)(?=c) 仅匹配ab后面跟着c的ab,即abcabd中仅匹配第一个ab |
?!exp |
负向先行断言,匹配后面不跟着exp的位置 |
(ab)(?!c)对于abcabd仅匹配第二个ab |
?<=exp |
正向后行断言,检查当前位置之前是否匹配特定模式 | (?<=a)(bc) 对于abcqbc仅会匹配第一个bc |
?<!exp |
负向后行断言,匹配前面不是exp的位置 |
(?<!a)(bc) 对于abcqbc仅会匹配第二个bc |
正则表达式常见应用场景
密码强度验证
要求密码至少包含一个大写字母、一个小写字母和一个数字,但不以数字开头:
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[A-Za-z]\w{7,}$
详细解释
^ # 字符串开始
(?=.*[a-z]) # 必须包含至少1个小写字母(正向预查)
(?=.*[A-Z]) # 必须包含至少1个大写字母(正向预查)
(?=.*\d) # 必须包含至少1个数字(正向预查)
[A-Za-z] # 首字符必须是字母
\w{7,} # 后续字符可以是字母/数字/下划线,且总长度≥8(首字符+7)
$ # 字符串结束
邮箱验证
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
详细解释
^ # 字符串开始
[a-zA-Z0-9._%+-]+ # 用户名部分(允许字母、数字、点、下划线、百分号、加号、减号)
@ # 必须包含 @ 符号
[a-zA-Z0-9.-]+ # 域名部分(允许字母、数字、点、减号)
\. # 必须包含一个点(.)
[a-zA-Z]{2,} # 顶级域名(至少2个字母,如 com、org、net)
$ # 字符串结束

浙公网安备 33010602011771号