如何用正则从SQL唯一键语句中提取所有列名(JavaScript场景)
在JavaScript中提取UNIQUE KEY中的指定列名
解决方案思路
要提取UNIQUE KEY部分的所有目标列名,需要分两步处理:
- 先捕获每个UNIQUE KEY定义中括号内的所有列内容
- 从捕获到的内容中提取纯列名,再筛选出目标列
具体实现代码
const sampleText = `UNIQUE KEY \`index8\` (\`u_login_id\`(255),sys_id,temoid),shouldnot appear text UNIQUE KEY \`index8\` (sys_id,\`u_login_id\`(255),temp_id),shouldnot appear text UNIQUE KEY \`index8\` (\`sys_id\`),shouldnot appear text UNIQUE KEY \`index8\` (sys_id\`,temp_id)`; // 定义需要提取的目标列集合 const targetColumns = new Set(['u_login_id', 'sys_id', 'temp_id']); // 匹配UNIQUE KEY括号内所有列内容的正则 const uniqueKeyBlockRegex = /UNIQUE KEY\s+`?\w+`?\s*\(([^)]+)\)/g; // 提取单个列名的正则(兼容带反引号、长度后缀的情况) const columnExtractorRegex = /`?(\w+)`?(?:\(\d+\))?/g; let blockMatch; // 遍历所有UNIQUE KEY块 while ((blockMatch = uniqueKeyBlockRegex.exec(sampleText)) !== null) { const columnSection = blockMatch[1]; let columnMatch; const matchedTargetColumns = new Set(); // 提取当前块内的所有列名并筛选目标列 while ((columnMatch = columnExtractorRegex.exec(columnSection)) !== null) { const rawColumnName = columnMatch[1]; if (targetColumns.has(rawColumnName)) { matchedTargetColumns.add(rawColumnName); } } // 输出当前块的匹配结果 console.log(`匹配到的目标列:${Array.from(matchedTargetColumns).join(', ')}`); }
代码说明
uniqueKeyBlockRegex:全局匹配所有UNIQUE KEY定义,捕获括号内的全部列内容,确保不会遗漏任何UNIQUE KEY块columnExtractorRegex:匹配列名的各种写法,包括带反引号(sys_id)、带长度限制(u_login_id(255))的情况,提取出纯列名字符串- 目标列筛选:用
Set存储目标列,快速判断提取出的列是否符合要求,同时自动去重
示例输出
运行代码后,对应示例文本的输出为:
匹配到的目标列:u_login_id, sys_id 匹配到的目标列:sys_id, u_login_id, temp_id 匹配到的目标列:sys_id 匹配到的目标列:sys_id, temp_id
内容的提问来源于stack exchange,提问作者Fact
相关产品推荐
相关产品推荐

