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

如何用JavaScript将字符串中括号内内容传入函数处理后替换?

实现安全的括号内容替换函数(JavaScript)

需求很明确:写一个parse函数,遍历字符串里所有被()包裹的内容,把这些内容传给指定处理函数,最后用处理后的结果替换原括号部分。比如用一个把字符串转整数加1的foo函数,输入"My name is foo and I am (0) year old.",输出就得是"My name is foo and I am 1 year old."。

之前用replaceAll加eval的方案绝对不能用——eval会执行任意代码,要是括号里的内容是恶意脚本,直接就中招了,完全没安全性可言。下面给个用正则表达式+replace回调的健壮实现:

核心实现代码

function parse(str, handler) {
  // 匹配所有非嵌套的括号内容,捕获括号内的文本
  return str.replace(/\(([^)]+)\)/g, (match, content) => {
    // 把捕获到的内容传给处理函数,返回处理结果作为替换值
    return handler(content);
  });
}

// 示例处理函数:转整数加1
function foo(content) {
  return parseInt(content, 10) + 1;
}

// 测试调用
const input = "My name is foo and I am (0) year old. I have (2) apples and (5) oranges.";
const output = parse(input, foo);
console.log(output);
// 输出:"My name is foo and I am 1 year old. I have 3 apples and 6 oranges."

代码说明

  1. 正则表达式:/\(([^)]+)\)/g

    • \( 匹配左括号(转义是因为括号在正则里是特殊字符)
    • ([^)]+) 捕获组,匹配所有非右括号的字符(确保只匹配单个括号内的内容,不会跨括号)
    • \) 匹配右括号
    • g 全局标识,替换所有匹配项
  2. replace回调:

    • 回调函数的第二个参数content就是捕获到的括号内的文本
    • 直接把content传给处理函数handler,用返回值替换整个(xxx)部分,完全避免了eval的安全风险

嵌套括号场景扩展

如果你的场景里存在嵌套括号(比如((1+2)*3)),上面的正则就不够用了——因为它只会匹配最内层的括号内容。这种情况需要递归处理嵌套结构,示例如下:

function parseNested(str, handler) {
  // 先处理最内层括号,递归直到没有嵌套
  const processed = str.replace(/\(([^()]+)\)/g, (match, content) => handler(content));
  // 如果还有括号,继续递归处理
  return processed.includes('(') ? parseNested(processed, handler) : processed;
}

// 测试嵌套场景
const nestedInput = "The result is ((0)+(2))";
const nestedOutput = parseNested(nestedInput, foo);
console.log(nestedOutput);
// 输出:"The result is (1+3)",如果需要继续计算可以调整handler逻辑

这个实现完全避开了eval的安全隐患,同时能覆盖大多数常规场景,扩展性也强——只要调整handler函数就能实现不同的处理逻辑。

内容的提问来源于stack exchange,提问作者Sidney Welsh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:57:51