用户名正则验证疑问:为何"Jone1234567"不被判定为有效?
问题原因分析
输入的"Jone1234567"未被判定为有效,核心原因是正则表达式的正向预查位置错误:
原正则结构为:
^[A-Za-z](?=.*[A-Z])(?=.*[a-z])(?=.*\d)[A-Za-z0-9_]{7,29}$
它先匹配第一个字母(此处为大写J),随后的三个正向预查(?=.*[A-Z])、(?=.*[a-z])、(?=.*\d)是从第一个字符之后的位置开始检查后续内容。而"Jone1234567"第一个字符之后的内容是one1234567,其中没有大写字母,导致(?=.*[A-Z])断言失败,整个正则匹配不通过。
需求要求整个用户名(包含第一个字符)至少包含一个大写字母、小写字母和数字,正确的写法是将三个正向预查放在正则最开头,让它们检查整个字符串的内容,修改后的正则如下:
^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)[A-Za-z][A-Za-z0-9_]{7,29}$
这样预查会先断言整个字符串满足字符类型要求,再匹配以字母开头、后续7-29个合法字符的规则,就能正确匹配"Jone1234567"这类符合要求的用户名。
内容的提问来源于stack exchange,提问作者34_Lưu Phước Tài
相关产品推荐
相关产品推荐

