You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 16:12:27