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
相关产品推荐
相关产品推荐

