字符串处理应让正则专注模式识别、JS原生方法负责语义操作;先标准化再匹配,善用replace回调、matchAll结构化提取,避免过度依赖正则。

字符串处理的核心,不在于堆砌方法,而在于让正则和现代 JS 特性各司其职、自然协作。正则专注“模式识别”,JS 原生方法负责“语义操作”,两者配合才能既精准又可读。
用模板字面量预处理,再交给正则匹配
别把原始字符串直接塞给复杂正则。先用模板字面量或 trim()、toLowerCase() 等做标准化,降低正则负担。
- 用户输入邮箱常带空格或大小写混用:先 email.trim().toLowerCase(),再用 /^[^\s@]+@[^\s@]+\.[^\s@]+$/ 验证
- 要提取日志中的时间戳,先用 line.split(']')[0].slice(1) 切出前半段,再对结果用 /\d{4}-\d{2}-\d{2} \d{2}:\d{2}/ 提取
replace 配合函数回调,实现动态替换
单纯用 replace(/pattern/g, 'new') 只能做静态替换。加上函数参数,就能根据匹配内容实时计算新值。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 把所有数字加 1:text.replace(/\d+/g, match => Number(match) + 1)
- 高亮关键词但保留原大小写:text.replace(/javascript/gi, match => `${match}`)
- 用捕获组重构路径:url.replace(/^\/user\/(\w+)\/post\/(\d+)$/, (_, user, id) => `/profile/${user}?post=${id}`)
用 matchAll 替代反复 exec,获取全部结构化结果
matchAll() 返回可迭代对象,天然支持 for...of 和展开语法,比手动循环 exec() 清晰得多,尤其适合提取多组数据。
- 提取所有邮箱:[...text.matchAll(/[\w.-]+@[\w.-]+\.\w+/g)].map(m => m[0])
- 带命名捕获组更直观:const re = /(?<name>\w+)@(?<domain>\w+\.\w+)/g;,然后 [...text.matchAll(re)] 每项都有 .groups.name 和 .groups.domain
避免过度依赖正则,该用原生方法时就用
不是所有字符串问题都该用正则解决。现代 JS 提供了大量语义清晰的原生方法,性能好、易维护。
- 判断是否包含子串?用 str.includes('foo'),别写 /foo/.test(str)
- 检查开头/结尾?用 str.startsWith('https://') 或 str.endsWith('.js')
- 重复生成分隔线?用 '-'.repeat(60),比 '-'.repeat(60) 更直接
- 分割固定分隔符?用 str.split(','),除非分隔符本身有变体才考虑正则 str.split(/,\s*/)

















