多级标签的匹配问题
· 阅读需 1 分钟
对于简单的 pattern, 只要匹配多级标签中的某个即可
例如对于 a/b/c/d, a、b、c、d 均可匹配
对于多级 pattern, 只要匹配多级标签中的一个连续部分即可
例如对于 a/b/c/d, a/b、b/c、c/d 均可匹配
实现方法
- 正则法
function hasTag(tags, pattern) {
const regex = new RegExp(`(^|/)${pattern.replace(/[.*+?^${}()|[\]\]/g, '\$&')}(/|$)`);
return tags?.some(tag => regex.test(tag)) ?? false;
} - 集合法: 拆分各个部分, 并构造所有可能的组合
// 带缓存的版本
const tagPartsCache = new WeakMap();
function getTagParts(tags) {
if (!tags) return new Set();
if (tagPartsCache.has(tags)) {
return tagPartsCache.get(tags);
}
const parts = new Set();
for (const tag of tags) {
const segments = tag.split('/');
for (let i = 0; i < segments.length; i++) {
for (let j = i; j < segments.length; j++) {
const subPath = segments.slice(i, j + 1).join('/');
parts.add(subPath);
}
}
}
tagPartsCache.set(tags, parts);
return parts;
}
如果要在多个标签中匹配呢
如果 pattern 不止一个呢 如何进行逻辑组合?