如何在Javascript中过滤出全数字串及匹配指定模式的数字类字符串
问题原因
你原有代码中的el==+el逻辑会将包含-的字符串转为NaN,直接过滤掉了第二类合法元素,这是输出结果不符合预期的核心原因。
满足当前需求的解决方案
直接调整正则逻辑,移除多余的数字转换校验即可:
const arr = ["ab's-test#s", "ab-c", "124", "123-12345"]; // 正则同时匹配全数字、xxx-xxxxx两种格式 const validReg = /^(?:\d+|\d{3}-\d{5})$/; const arr2 = arr.filter(el => el.length && validReg.test(el)); console.log(arr2) // 输出 ["124", "123-12345"]
正则说明
^和$限定字符串整体匹配,避免部分匹配的脏数据- 非捕获组
(?:)内的|分隔两类合法规则:\d+匹配任意长度的全数字字符串\d{3}-\d{5}匹配xxx-xxxxx格式的字符串
支持后续扩展的优化方案
如果后续需要新增更多合法格式,建议把所有格式规则单独维护,动态拼接正则,新增规则无需修改过滤逻辑:
const arr = ["ab's-test#s", "ab-c", "124", "123-12345", "12-12345", "1-23-456"]; // 所有合法格式的正则片段,新增规则直接往数组加即可 const validRules = [ '\\d+', // 全数字 '\\d{3}-\\d{5}', // xxx-xxxxx '\\d{2}-\\d{5}', // 新增格式:xx-xxxxx '\\d-\\d{2}-\\d{3}' // 新增格式:x-xx-xxx ]; // 动态生成完整匹配正则 const combinedReg = new RegExp(`^(?:${validRules.join('|')})$`); const arr2 = arr.filter(el => el.length && combinedReg.test(el)); console.log(arr2) // 输出 ["124", "123-12345", "12-12345", "1-23-456"]
内容的提问来源于stack exchange,提问作者Tania
相关产品推荐
相关产品推荐

