Dart正则表达式长度验证疑问:为何最大长度校验不生效?
问题:Dart正则校验密码长度时最大长度限制失效
作为Dart初学者,我尝试用正则表达式验证密码字符串长度,但效果不符合预期。我知道正则里的{}表示长度范围,{12,15}代表12-15个字符,于是写了密码校验代码。现在最小长度校验生效,但最大长度校验失效——哪怕密码长度超过15,依然输出“Perfect Password”。
代码示例
const password = r"dsjRK@#RDsk34$SwedfQWDF"; if (!password.contains(RegExp(r'[a-z]'))) { print('password should contain atleast lower case character'); } else if (!RegExp(r'[A-Z]').hasMatch(password)) { print('password should contain atleast lower case character'); // 提示文本错误,应为大写字母 } else if (!RegExp(r'[0-9]').hasMatch(password)) { print('password should contain atleast one digits'); } else if (!RegExp(r'[$@#%&*^!]').hasMatch(password)) { print('password should contain atleast one special charatcer'); // 拼写错误:charatcer → character } else if (!RegExp(r'.{12,15}').hasMatch(password)) { print('password atleast 12 max 15 digits'); // 表述错误:digits → 字符 } else { print("Perfect Password"); }
输出结果
Perfect Password
原因分析与解决方案
失效原因
你使用的正则r'.{12,15}'仅会匹配字符串中任意一段12-15个字符的子串,而非校验整个字符串的长度。哪怕密码长度远超15,字符串里必然存在符合12-15长度的片段,所以hasMatch会返回true,导致最大长度的校验条件永远不会触发。
修复方案
要校验整个字符串的长度,必须用正则锚点限定范围:
^:匹配字符串的开头$:匹配字符串的结尾
把长度校验的正则改成r'^.{12,15}$',这样就会强制检查整个字符串的长度是否在12-15之间。
修正后的代码
const password = r"dsjRK@#RDsk34$SwedfQWDF"; if (!password.contains(RegExp(r'[a-z]'))) { print('密码至少包含一个小写字母'); } else if (!RegExp(r'[A-Z]').hasMatch(password)) { print('密码至少包含一个大写字母'); } else if (!RegExp(r'[0-9]').hasMatch(password)) { print('密码至少包含一个数字'); } else if (!RegExp(r'[$@#%&*^!]').hasMatch(password)) { print('密码至少包含一个特殊字符'); } else if (!RegExp(r'^.{12,15}$').hasMatch(password)) { print('密码长度需在12-15个字符之间'); } else { print("完美密码"); }
额外提示
原代码里还有几处小错误:
- 第二个分支的提示文本写错,应该提示“大写字母”而非“小写字母”
- “charatcer”拼写错误,应为“character”
- 长度提示里的“digits”表述错误,应为“字符”(因为密码包含字母、符号等,不只是数字)
内容的提问来源于stack exchange,提问作者Saranya Subramanian
相关产品推荐
相关产品推荐

