JavaScript文件夹名称正则表达式问题:验证始终返回yes
问题分析与修正
你的正则表达式确实存在错误,导致无法正确限制文件夹名称的总长度,才会出现超长字符串依然返回“yes”的情况。
原正则的核心问题
原表达式 /^[a-zA-Z0-9]+([a-zA-Z0-9_ -]){0,20}$/ 的逻辑漏洞:
- 未限制总长度:开头的
[a-zA-Z0-9]+是匹配1个及以上的字母/数字,这部分长度没有上限,哪怕开头就有100个数字,只要后面跟着的允许字符不超过20个,正则就会判定匹配,完全无视了你“总长度最大20”的要求。 - 长度计算错误:就算忽略开头的无限匹配,
[a-zA-Z0-9]+(至少1个)加上后面的{0,20}(最多20个),总长度会允许到21,也不符合最大20的限制。
修正后的正则方案
推荐两种简洁的修正方式:
方式1:直接控制字符数量
明确要求开头1个字母/数字,后面最多跟19个允许字符,总长度刚好控制在1~20:
var regex = /^[a-zA-Z0-9][a-zA-Z0-9_ -]{0,19}$/;
方式2:用正向预查明确长度限制
如果想更直观体现总长度要求,可以搭配正向预查:
var regex = /^(?=.{1,20}$)[a-zA-Z0-9][a-zA-Z0-9_ -]*$/;
(?=.{1,20}$):提前校验整个字符串长度在1~20之间[a-zA-Z0-9]:保证开头是字母或数字[a-zA-Z0-9_ -]*:后面可跟任意数量(含0)的允许字符,配合预查限制总长度
测试修正后的代码
用你的测试字符串验证,现在会正确返回“no”:
var regex = /^[a-zA-Z0-9][a-zA-Z0-9_ -]{0,19}$/; var newName = "12345678901234567890233_pm"; if (regex.test(newName)) { console.log('yes'); }else{ console.log('no'); // 输出no,符合预期 }
内容的提问来源于stack exchange,提问作者Dev Dev
相关产品推荐
相关产品推荐

