如何校验字符串模板格式匹配度并提取占位符值,有可用JS库吗?
模板匹配实现方案
原生实现(无第三方依赖)
通过将基准模板动态转换为正则表达式的方式即可实现需求,相比逐字符对比代码更简洁,维护成本更低:
核心逻辑:
- 先提取基准模板中所有
<占位符>标记 - 转义模板中的正则特殊字符,将占位符位置替换为正则捕获组
- 生成的正则直接匹配目标字符串,匹配成功则自动生成占位符与对应值的映射,匹配失败直接抛出错误
代码示例:
// 定义基准模板 const templateA = ` Table <name> { <attribute-name> <data-type> } ` // 生成模板匹配器的工具函数 function createTemplateMatcher(template) { const placeholders = [] // 处理模板生成正则字符串 const regexPattern = template .trim() // 转义正则特殊字符 .replace(/[.*+?^${}()|[\]\\]/g, '\\$&') // 提取占位符并替换为捕获组 .replace(/<([\w-]+)>/g, (_, placeholderName) => { placeholders.push(placeholderName) // 可根据实际需求调整匹配规则,比如允许特殊字符可修改此处的匹配规则 return '(\\w+)' }) // 兼容任意数量的空白字符(换行、空格、制表符通用) .replace(/\s+/g, '\\s+') const matchRegExp = new RegExp(`^${regexPattern}$`) // 返回匹配执行函数 return function match(targetStr) { const matchResult = targetStr.trim().match(matchRegExp) if (!matchResult) { throw new Error('目标字符串不符合基准模板格式') } // 组装占位符映射对象 return placeholders.reduce((map, name, index) => { map[name] = matchResult[index + 1] return map }, {}) } } // 测试用例 const matcher = createTemplateMatcher(templateA) // 测试符合格式的B const strB = ` Table User { name varchar } ` console.log(matcher(strB)) // 输出:{ name: 'User', 'attribute-name': 'name', 'data-type': 'varchar' } // 测试不符合格式的C const strC = ` Table Price { name } ` try { matcher(strC) } catch (err) { console.log(err.message) // 输出:目标字符串不符合基准模板格式 }
可选第三方库
如果模板规则更复杂,比如需要支持嵌套结构、可选字段、自定义类型校验,可以使用以下库:
- Peggy:原PEG.js,语法解析器生成工具,支持自定义完整的语法规则,适合复杂结构化字符串匹配
- string-parser:轻量级模板匹配工具,支持自定义占位符规则和校验逻辑,开箱即用
内容的提问来源于stack exchange,提问作者PrimeSquid
相关产品推荐
相关产品推荐

