You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中*与?通配符字符串匹配问题求解

通配符匹配:同时支持*和?的正则改造方案

你只需要在现有代码中增加对?通配符的转换逻辑即可,核心思路是将通配符?映射为正则表达式中的.(匹配单个任意字符)。以下是修改后的完整代码及说明:

修改后的代码

async function WildCardEvaluator(field: string, rule: string): Promise<Boolean> {
    // 转义所有正则特殊字符,避免规则中的普通字符被误解析为正则语法
    const escapeRegex = (str: string) => str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");

    // 处理通配符:
    // 1. 按*分割规则
    // 2. 转义每个分段的正则特殊字符
    // 3. 将转义后的\?替换为.(对应通配符?的功能)
    // 4. 用.*连接分段(对应通配符*的功能)
    rule = rule.split("*")
        .map(escapeRegex)
        .map(part => part.replace(/\\\?/g, "."))
        .join(".*");

    // 添加首尾锚点,确保规则匹配整个字符串而非子串
    rule = "^" + rule + "$";

    // 创建正则实例并执行匹配
    const regex = new RegExp(rule);
    return regex.test(field);
}

关键改动说明

  • 新增的.map(part => part.replace(/\\\?/g, "."))是核心:经过escapeRegex转义后,规则中的?会变成\?(正则中表示实际问号),我们需要将其替换为.,让它实现"匹配单个任意字符"的通配符功能。

测试验证

针对你给出的示例场景:

  1. PHO12RO vs PH?12RO:规则转换后为^PH.12RO$,O匹配.,返回true
  2. PHO12RO vs PH?12*:规则转换后为^PH.12.*$,PHO12匹配PH.12,RO匹配.*,返回true
  3. PHO13RO vs PH?12*:规则转换后为^PH.12.*$,PHO13无法匹配PH.12,返回false

额外说明

如果需要匹配字符串中的实际问号(而非通配符),只需在规则中使用\?,代码会将其转义为\?保留在正则中,实现对实际问号的匹配。

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 19:47:02