JavaScript:替换字符串指定单词,排除单/双引号内的内容
解决SQL字符串中引号外指定内容的替换问题
正则表达式方案
利用正则捕获组区分引号包裹内容与目标内容,配合替换函数实现精准替换:
const sql = `select {foo} from Table where {foo} = "This is {foo} today" or {foo} = 'this is {foo} tomorrrow' or {foo} = "it's all '{foo}' to me!"`; const target = '{foo}'; const replacement = 'bar'; // 正则匹配规则:优先匹配双/单引号包裹的内容,再匹配目标字符串 const regex = /("([^"]|"")*"|'([^']|'')*')|({foo})/g; const result = sql.replace(regex, (match, quotedContent) => { // 若捕获到引号内容则直接返回,否则替换为目标值 return quotedContent ? match : replacement; }); console.log(result);
正则规则说明
"([^"]|"")*":匹配双引号包裹的内容,支持SQL标准的""转义双引号写法'([^']|'')*':匹配单引号包裹的内容,支持SQL标准的''转义单引号写法|({foo}):匹配需要替换的目标字符串{foo}- 替换函数通过判断是否捕获到引号内容,决定返回原内容还是替换值
遍历字符串方案(非正则)
如果对正则语法不熟悉,可通过遍历字符串跟踪引号状态实现需求:
const sql = `select {foo} from Table where {foo} = "This is {foo} today" or {foo} = 'this is {foo} tomorrrow' or {foo} = "it's all '{foo}' to me!"`; const target = '{foo}'; const replacement = 'bar'; let result = ''; let inSingleQuote = false; let inDoubleQuote = false; let i = 0; while (i < sql.length) { // 切换单引号状态(仅当不在双引号内时生效) if (sql[i] === "'" && !inDoubleQuote) { inSingleQuote = !inSingleQuote; result += sql[i]; i++; } // 切换双引号状态(仅当不在单引号内时生效) else if (sql[i] === '"' && !inSingleQuote) { inDoubleQuote = !inDoubleQuote; result += sql[i]; i++; } // 不在引号内时,检查是否匹配目标字符串 else if (!inSingleQuote && !inDoubleQuote && sql.startsWith(target, i)) { result += replacement; i += target.length; } // 其他情况直接追加字符 else { result += sql[i]; i++; } } console.log(result);
逻辑说明
- 用两个布尔变量跟踪当前是否处于单/双引号内
- 遍历过程中遇到引号时,切换对应状态(不同类型引号互不干扰)
- 不在引号范围内时,检查当前位置是否匹配目标字符串,匹配则替换并跳过对应长度;否则直接追加字符
验证结果
两种方案处理示例输入后,输出均符合预期:
select bar from Table where bar = "This is {foo} today" or bar = 'this is {foo} tomorrrow' or bar = "it's all '{foo}' to me!"
内容的提问来源于stack exchange,提问作者kiwichris
相关产品推荐
相关产品推荐

