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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 08:15:34