当前位置:首页 > JavaScript

js实现通配符

2026-02-02 08:52:35JavaScript

通配符匹配的实现方法

在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];
}

实际应用场景

  • 文件系统路径匹配
  • 搜索引擎的简单查询语法
  • 表单输入验证中的模糊匹配

注意事项:

js实现通配符

  • 性能敏感场景建议使用动态规划方案
  • 正则表达式方案需注意特殊字符转义
  • 递归方案在极端情况下可能出现栈溢出

标签: 通配符js
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 // 方…

js实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…