JavaScript 通配符模式匹配

JavaScript 通配符模式匹配

在本文中,我们将介绍使用通配符进行模式匹配,这是计算机科学和字符串操作中遇到的问题。目标是确定给定的通配符模式是否与字符串匹配。在本文中,我们将讨论通配符模式匹配的逐步算法,并提供JavaScript的代码示例。

理解通配符模式

通配符模式由特殊符号的字母组成,例如

  • ‘ * ‘ 表示一个字符序列(包括空格)
  • ‘ ? ‘ 表示一个单个字符。

示例:

Text = "GeeksforGeeks",
Pattern = “*****Ge*****ks", output: true
Pattern = "Geeksfor?eeks", output: true
Pattern = "Ge*k?", output: true
Pattern = "e*ks", output: false 

通配符模式匹配的方法

  • Javascript正则表达式
  • 模式匹配算法

使用Javascript正则表达式进行通配符模式匹配

Javascript提供了对表达式的支持,这为处理通配符模式匹配提供了一种方便的方式。正则表达式是一种用于在字符串中查找字符组合的模式。

这是一个使用Javascript表达式进行模式匹配的示例:

语法:

function wildcardMatch(text, pattern) {
    const regexPattern =
        new RegExp('^' + pattern.replace(/\?/g, '.').replace(/\*/g, '.*') + '$');
    return regexPattern.test(text);
}

参数:

  • text: 这是要检查的主要字符串。
  • pattern: 这是用于检查文本中特定模式的通配符模式。

在此实现中:

  • 通配符匹配RegExp函数将给定的通配符模式转换为正则表达式模式。它将“?”替换为“.”以匹配任何字符。使用“.”来匹配零个或多个字符。
  • 为了确保整个字符串与模式匹配,正则表达式在字符串的开头(^)和结尾($)处被锚定。
  • 使用正则表达式对象的test方法来检查文本是否与模式匹配。

这种方法简洁明了。利用JavaScript内置的表达式功能,实现有效处理通配符模式匹配。同样,您可以通过提供文本和模式值并验证结果来添加测试用例。

示例: 此示例演示了上述方法。

Javascript

function wildcardMatchRegExp(text, pattern) { 
  
    // Convert wildcard pattern to a  
    // regular expression pattern 
    const regexPattern = new RegExp( 
        "^" + 
        pattern 
            .replace(/\?/g, ".") 
            .replace(/\*/g, ".*") + 
        "$"
    ); 
  
    // Test if the text matches the 
    // regular expression pattern 
    return regexPattern.test(text); 
} 
  
// Test case 
const text = "GeeksforGeeks"; 
const pattern = "*****Ge****ks"; 
  
if (wildcardMatchRegExp(text, pattern)) { 
    console.log("Pattern is Matched"); 
} else { 
    console.log("Pattern is not matched"); 
}

输出

Pattern is Matched

通配符模式匹配使用模式匹配算法

该算法处理模式中的符号,如’ * ‘,它匹配字符序列(空字符),以及’ ? ‘,它只匹配一个字符。

算法步骤

让我们分解模式匹配算法中涉及的步骤:

  • 计算文本(n)和模式(m)的长度。
  • 如果任何一个模式是空字符串,即n 0或m 0,则返回false。
  • 使用JavaScript循环和两个指针i和j,迭代字符串并应用匹配。
  • 当满足以下条件时,将i和j同时增加1:
    • text[i]和pattern[j]上的字符相同。
    • pattern[j]是符号’?’。
  • 如果j遇到通配符符号’‘,将i和j的值存储为textPointer和pattPointer,并递增j以越过通配符符号’‘。
  • 如果pattPointer已更新,则递增i,j和textPointer各1。
  • 在j仍在边界内且pattern[j]是通配符符号’‘的情况下,迭代并递增j以越过通配符符号’‘。
  • 如果j指针达到模式的末尾,即j m,则返回true,否则返回false。

示例: 下面是上述算法在JavaScript中的实现。

Javascript

function wildcard(text, pattern) { 
    const n = text.length; 
    const m = pattern.length; 
  
    if (m === 0) { 
        return n === 0; 
    } 
  
    let i = 0, 
        j = 0, 
        textPointer = -1, 
        pattPointer = -1; 
    while (i < n) { 
        if (text[i] === pattern[j]) { 
            i++; 
            j++; 
        } else if (j < m && pattern[j] === "?") { 
            i++; 
            j++; 
        } else if (j < m && pattern[j] === "*") { 
            textPointer = i; 
            pattPointer = j; 
            j++; 
        } else if (pattPointer !== -1) { 
            j = pattPointer + 1; 
            i = textPointer + 1; 
            textPointer++; 
        } else { 
            return false; 
        } 
    } 
  
    while (j < m && pattern[j] === "*") { 
        j++; 
    } 
  
    return j === m; 
} 
  
// Test case 
const text = "GeeksforGeeks"; 
const pattern = "*****Ge****ks"; 
  
if (wildcard(text, pattern)) { 
    console.log("Pattern is Matched"); 
} else { 
    console.log("Pattern is not Matched"); 
}

输出

Pattern is Matched

时间复杂度: O(n*m)其中“n”是文本字符串的长度,“m”是模式字符串的长度。

空间复杂度: O(n+m)其中“n”是文本字符串的长度,“m”是模式字符串的长度。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程