返回
TechStack 背后的故事:因需求而生的特殊数据结构:正则 Map
后端
2023-12-28 22:16:23
TechStack 是一款用于显示 GitHub 项目技术栈的浏览器插件。在开发过程中,我遇到了一个有趣的技术需求。
背景:理解 package.json
package.json 是一个 JSON 文件,了 Node.js 项目的依赖项、脚本和元数据。其中,dependencies 字段列出了项目运行所需的依赖项及其版本。
需求:提取依赖项名称和版本
TechStack 需要从 package.json 中提取依赖项的名称和版本。然而,依赖项的格式各不相同,可能包含空格、下划线和其他特殊字符。这使得使用字符串分割或正则表达式提取信息变得困难。
解决方案:正则 Map
为了解决这个问题,我创建了一种特殊的数据结构:正则 Map。它类似于 JavaScript 中的 Map,但使用正则表达式作为键。
class RegexMap {
constructor() {
this.map = new Map();
}
set(regex, value) {
this.map.set(regex, value);
}
get(regex) {
for (const [key, value] of this.map) {
if (key.test(regex)) {
return value;
}
}
return null;
}
}
使用正则 Map 提取信息
const regexMap = new RegexMap();
regexMap.set(/^(@.*\/)?(.*)@/, '$2'); // 提取依赖项名称
regexMap.set(/^(@.*\/)?(.*)@(.*)/, '$3'); // 提取依赖项版本
const dependencyName = regexMap.get('@babel/core'); // "babel/core"
const dependencyVersion = regexMap.get('@babel/core@7.16.0'); // "7.16.0"
好处
正则 Map 具有以下好处:
- 灵活性: 正则表达式可以匹配复杂的字符串模式,使提取信息更加容易。
- 效率: 与遍历数组或对象相比,使用正则 Map 查找键值对更加高效。
- 可维护性: 使用正则 Map 可以将提取规则与数据分离,提高代码的可读性和可维护性。
总结
正则 Map 是一种特殊的数据结构,它使用正则表达式作为键,解决了 TechStack 中从 package.json 中提取依赖项名称和版本的难题。它体现了根据需求创造定制解决方案的重要性,并为处理复杂字符串模式提供了强大的工具。