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转义后,规则中的?会变成\?(正则中表示实际问号),我们需要将其替换为.,让它实现"匹配单个任意字符"的通配符功能。
测试验证
针对你给出的示例场景:
PHO12ROvsPH?12RO:规则转换后为^PH.12RO$,O匹配.,返回truePHO12ROvsPH?12*:规则转换后为^PH.12.*$,PHO12匹配PH.12,RO匹配.*,返回truePHO13ROvsPH?12*:规则转换后为^PH.12.*$,PHO13无法匹配PH.12,返回false
额外说明
如果需要匹配字符串中的实际问号(而非通配符),只需在规则中使用\?,代码会将其转义为\?保留在正则中,实现对实际问号的匹配。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

