Flutter中使用正则校验密码输入框大小写匹配规则失效如何修复
错误原因
大小写匹配的两个正则存在逻辑错误:
^匹配字符串起始位置,$匹配字符串结束位置,(?=.*[A-Z])、(?=.*[a-z])属于零宽度正向预查规则,仅做位置合法性判断,不会实际匹配、消耗字符串内容。- 你写的
RegExp(r'^(?=.*[A-Z])$')、RegExp(r'^(?=.*[a-z])$'),实际校验逻辑是「字符串起始和结束位置重合(即空字符串),且该位置后存在对应大小写字母」,永远无法匹配非空的密码输入,因此始终不生效。 - 长度校验规则
RegExp(r'^.{8,}$')包含.{8,}的实际字符匹配逻辑,所以可以正常运行。
修复方案
给两个大小写正则的预查规则后补全任意字符匹配段即可,修正后的校验代码如下:
RegExp regexUpper = RegExp(r'^(?=.*[A-Z]).*$'); RegExp regexLower = RegExp(r'^(?=.*[a-z]).*$'); RegExp regexLength = RegExp(r'^.{8,}$'); if (!regexLength.hasMatch(value.toString())) { return 'Пароль слишком короткий'; } if (!regexLower.hasMatch(value.toString())) { // 原代码中的print(value)为调试打印语句,不影响校验逻辑,可按需保留或删除 return 'Пароль должен содержать хотя бы одну маленькую букву'; } if (!regexUpper.hasMatch(value.toString())) { return 'Введите хотя бы одну заглавную букву'; } return null;
可选优化:如果不需要针对不同校验失败场景返回差异化提示,可以把三个规则合并为单个正则,减少重复匹配开销,写法为
RegExp(r'^(?=.*[a-z])(?=.*[A-Z]).{8,}$')。
内容的提问来源于stack exchange,提问作者GDTyka
相关产品推荐
相关产品推荐

