js实现通配符
通配符匹配的基本概念
通配符匹配通常指使用*(匹配任意数量字符)和?(匹配单个字符)的模式匹配。JavaScript中可通过正则表达式或自定义算法实现类似功能。
使用正则表达式转换
将通配符模式转换为正则表达式是实现匹配的常见方法。例如:
function wildcardToRegex(pattern) {
const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&');
return new RegExp(`^${escaped.replace(/\*/g, '.*').replace(/\?/g, '.')}$`, 'i');
}
// 使用示例
const regex = wildcardToRegex('file*.txt');
regex.test('file123.txt'); // true
递归匹配算法
对于更复杂的场景,可递归实现通配符匹配:
function isMatch(str, pattern) {
let s = 0, p = 0, starIdx = -1, match = 0;
while (s < str.length) {
if (p < pattern.length && (pattern[p] === '?' || pattern[p] === str[s])) {
s++;
p++;
} else if (p < pattern.length && pattern[p] === '*') {
starIdx = p;
match = s;
p++;
} else if (starIdx !== -1) {
p = starIdx + 1;
match++;
s = match;
} else {
return false;
}
}
while (p < pattern.length && pattern[p] === '*') p++;
return p === pattern.length;
}
性能优化建议
对于高频匹配场景,建议预编译正则表达式。动态生成的模式可通过缓存机制存储已转换的正则对象,避免重复计算。
边界情况处理
需注意空字符串匹配、连续通配符(如)等特殊情况。通常应将连续*视为单个*:
function normalizePattern(pattern) {
return pattern.replace(/\*\*/g, '*');
}
浏览器API替代方案
现代浏览器支持URLPatternAPI(实验性功能),可处理类似通配符的路径匹配:

const pattern = new URLPattern({ pathname: '/file/*.txt' });
pattern.test({ pathname: '/file/test.txt' }); // true






