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”是模式字符串的长度。