js实现通配符
通配符匹配的实现方法
在JavaScript中实现通配符匹配通常涉及字符串模式匹配,常见需求包括*(匹配任意数量字符)和?(匹配单个字符)的功能。以下是几种实现方式:
使用正则表达式转换
将通配符模式转换为正则表达式是最直接的方法:
function wildcardToRegex(pattern) {
const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&');
const regexStr = escaped.replace(/\*/g,'.*').replace(/\?/g,'.');
return new RegExp(`^${regexStr}$`, 'i');
}
// 示例用法
const regex = wildcardToRegex("file*.txt");
regex.test("file123.txt"); // true
递归匹配算法
对于更复杂的场景,可采用递归方式逐字符匹配:
function isMatch(str, pattern) {
let strIndex = 0, patternIndex = 0;
while (patternIndex < pattern.length) {
const pChar = pattern[patternIndex];
if (pChar === '*') {
while (pattern[patternIndex + 1] === '*') {
patternIndex++;
}
return isMatch(str.slice(strIndex), pattern.slice(patternIndex + 1))
|| (strIndex < str.length && isMatch(str.slice(strIndex + 1), pattern.slice(patternIndex)));
}
if (strIndex >= str.length) return false;
if (pChar !== '?' && pChar !== str[strIndex]) return false;
strIndex++;
patternIndex++;
}
return strIndex === str.length;
}
动态规划优化
对于性能要求高的场景,可以使用动态规划:
function wildcardDP(str, pattern) {
const dp = Array(str.length + 1).fill().map(() =>
Array(pattern.length + 1).fill(false));
dp[0][0] = true;
for (let j = 1; j <= pattern.length; j++) {
if (pattern[j-1] === '*') dp[0][j] = dp[0][j-1];
}
for (let i = 1; i <= str.length; i++) {
for (let j = 1; j <= pattern.length; j++) {
if (pattern[j-1] === '*') {
dp[i][j] = dp[i][j-1] || dp[i-1][j];
} else {
dp[i][j] = dp[i-1][j-1] &&
(pattern[j-1] === '?' || str[i-1] === pattern[j-1]);
}
}
}
return dp[str.length][pattern.length];
}
实际应用场景
- 文件系统路径匹配
- 搜索引擎的简单查询语法
- 表单输入验证中的模糊匹配
注意事项:
- 性能敏感场景建议使用动态规划方案
- 正则表达式方案需注意特殊字符转义
- 递归方案在极端情况下可能出现栈溢出







