如何在RegEx替换中排除小写字符串?JavaScript实现疑问
正则批量替换仅匹配大写开头字符串的解决方案
现有一段JavaScript代码,通过遍历对象键值对实现字符串批量替换,但当前会把小写形式的目标(如a、am)一并替换,需求是仅替换大写开头的目标字符串(如A、Am),保留原有小写内容。
原代码及问题表现
原代码
let str = "a A am Am a# A# a#d A#d"; let obj = { 'A': 'a-uppercase', 'Am': 'a-minor', 'A#': 'a-hasgtag', 'A#d': 'a-minor-d', }; function allReplace(par_one, par_two) { for (const x in obj) { let rx = new RegExp( "(^|\\s)" + x.replace(/[-\\/\\^$*+?.()|[\\]{}]/g, "\\$&") + "(?!\\S)", "gi" ); console.log(obj[x]); str = str.replace(rx, "$1" + obj[x]); } return str; } console.log(allReplace(str, obj));
当前输出
a-uppercase a-uppercase a-minor a-minor a-hasgtag a-hasgtag a-minor-d a-minor-d
期望输出
a a-uppercase am a-minor a# a-hasgtag a#d a-minor-d
解决方案
修改要点
- 移除正则的
i修饰符:原正则使用gi(全局匹配+忽略大小写),导致大小写形式的目标都会被匹配,移除i后仅严格匹配键的大小写 - 按键的长度从长到短排序:对象键默认按插入顺序遍历,若短键(如
A#)先被替换,会破坏长键(如A#d)的匹配,排序后确保长匹配优先执行 - 避免全局变量污染:原函数直接修改全局
str,改为操作函数参数par_one,保持函数独立性
修改后的完整代码
let str = "a A am Am a# A# a#d A#d"; let obj = { 'A': 'a-uppercase', 'Am': 'a-minor', 'A#': 'a-hasgtag', 'A#d': 'a-minor-d', }; function allReplace(par_one, par_two) { // 将对象键按长度从长到短排序,确保长匹配优先 const sortedKeys = Object.keys(par_two).sort((a, b) => b.length - a.length); let resultStr = par_one; for (const x of sortedKeys) { let rx = new RegExp( "(^|\\s)" + x.replace(/[-\\/\\^$*+?.()|[\\]{}]/g, "\\$&") + "(?!\\S)", "g" // 仅保留全局匹配修饰符,移除忽略大小写修饰符 ); resultStr = resultStr.replace(rx, "$1" + par_two[x]); } return resultStr; } console.log(allReplace(str, obj));
执行结果
输出与期望完全一致:
a a-uppercase am a-minor a# a-hasgtag a#d a-minor-d
内容的提问来源于stack exchange,提问作者Ade
相关产品推荐
相关产品推荐

