You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:20:57