使用JavaScript解析条件语句并将指定条件查询转换为JavaScript数组
解析查询语句为JavaScript数组
嘿,我来帮你把这条条件查询语句转成你想要的JavaScript数组格式!
最终解析结果
先直接给你符合要求的扁平化数组结果(补充了client后面缺失的=,原语句里client="..."的运算符不能省略哦):
[ "project", "=", "test", "AND", "client", "=", "clinical and connection", "OR", "module", "IN", "login", "rigister and list", "AND", "start_date", "BETWEEN", "10-12-2016", "AND", "11-12-2016", "ORDER BY", "id", "asc" ]
如果你希望更贴合原语句语义,把IN的参数保留为子数组,也可以写成这样:
[ "project", "=", "test", "AND", "client", "=", "clinical and connection", "OR", "module", "IN", ["login", "rigister and list"], "AND", "start_date", "BETWEEN", "10-12-2016", "AND", "11-12-2016", "ORDER BY", "id", "asc" ]
解析思路说明
拆分的核心是带引号的字符串必须作为单个元素处理,不能被里面的空格或关键字(比如and)拆分:
- 优先提取所有带单/双引号的内容,去掉外层引号后作为单个值
- 拆分剩余的关键字(
AND/OR/IN/BETWEEN/ORDER BY)、字段名、运算符(=) - 清理掉
IN语句里的括号和逗号,把参数整理成连续元素或子数组 - 最后按原语句顺序把所有元素拼接成数组
动态解析的JavaScript函数示例
如果需要批量处理类似的查询语句,可以用正则匹配实现动态解析:
function parseQueryToArr(query) { // 匹配带引号的字符串、关键字、字段/运算符、括号/逗号 const regex = /"[^"]+"|'[^']+'|AND|OR|IN|BETWEEN|ORDER BY|\w+|=|,|\(|\)/gi; const tokens = query.match(regex); const result = []; let inIN = false; let inINValues = []; for (const token of tokens) { const lowerToken = token.toLowerCase(); // 处理带引号的字符串,去掉外层引号 if (token.startsWith('"') || token.startsWith("'")) { const value = token.slice(1, -1); if (inIN) { inINValues.push(value); } else { result.push(value); } continue; } // 处理IN语句的括号 if (token === '(') { if (result[result.length - 1]?.toLowerCase() === 'in') { inIN = true; } continue; } if (token === ')') { if (inIN) { // 这里可以选择直接push值到result(扁平化),或者push子数组 result.push(...inINValues); // 如果要子数组就用:result.push(inINValues); inIN = false; inINValues = []; } continue; } // 跳过逗号 if (token === ',') continue; // 保留原大小写的关键字、字段、运算符 result.push(token); } return result; } // 测试调用 const query = `project=test AND client="clinical and connection" OR module IN ("login",'rigister and list') AND start_date between "10-12-2016" AND "11-12-2016" ORDER BY id asc`; console.log(parseQueryToArr(query));
调整注释里的代码,就能切换扁平化数组或带IN子数组的格式。
内容的提问来源于stack exchange,提问作者Saravanan Krishnan
相关产品推荐
相关产品推荐

