跳到主要内容

多级标签的匹配问题

· 阅读需 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 不止一个呢 如何进行逻辑组合?