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

JavaScript解析含嵌套括号、引号的逻辑表达式为嵌套数组方案咨询

问题解答

核心结论

JavaScript 原生正则无法完整实现你需要的带嵌套括号递归解析的需求,原因是 ES 正则标准没有提供 PHP PCRE 中正则递归匹配(如(?R)语法)的能力,仅靠正则无法处理任意层级的嵌套括号结构。

无括号场景的正则实现

如果仅处理没有括号的平级表达式,你可以用以下 JS 正则完成分词,直接得到目标结果:

const parseFlatExpr = (str) => {
  const reg = /"([^"]+)"|(\b(?:OR|AND)\b)|[^\s"]+/g
  const result = []
  let match
  while((match = reg.exec(str)) !== null) {
    result.push(match[1] ?? match[0])
  }
  return result
}
// 测试:输入"this is a text" OR this,输出 ["this is a text", "OR", "this"]

完全可以满足你说的引号包裹内容不拆分的要求。

带嵌套括号场景的最优方案

最优解是先分词再手写递归下降解析器,总代码量不到50行,性能和灵活性都比第三方库好,示例实现如下:

const parseExpr = (str) => {
  // 第一步:分词
  const tokenReg = /"([^"]+)"|(\(|\))|(\b(?:OR|AND)\b)|[^\s()"]+/g
  const tokens = []
  let match
  while((match = tokenReg.exec(str)) !== null) {
    tokens.push(match[1] ?? match[0])
  }
  let pos = 0
  // 第二步:递归解析
  const parse = () => {
    const res = []
    while(pos < tokens.length) {
      const token = tokens[pos]
      if(token === ')') {
        pos++
        break
      }
      if(token === '(') {
        pos++
        res.push(parse())
        continue
      }
      res.push(token)
      pos++
    }
    return res
  }
  return parse()
}

// 测试你的示例
const input = 'this OR (this AND (this OR (that AND this))) OR this'
console.log(parseExpr(input))
// 输出结果完全符合你要求的嵌套数组格式

现成预构建库选择

如果不想自己手写解析逻辑,可以选择以下成熟的轻量库:

  • jsep:只有几十KB的JS表达式解析器,原生支持括号、逻辑运算符、字符串字面量,可自定义规则直接输出你需要的数组结构,没有额外冗余依赖。
  • expr-eval:支持更复杂的表达式解析,也可自定义配置适配你的需求。

内容的提问来源于stack exchange,提问作者Ben Beri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 09:36:03