实现正则表达式匹配算法

简介: 实现正则表达式匹配算法

前言


在正则表达式匹配规则中:.代表任意一个字符;* 代表它前面的字符可以出现任意次(含0次)。例如:字符串dpaaab与规则d.a*b匹配(所有字符匹配模式)。


本文将带着大家实现这个匹配算法,欢迎各位感兴趣的开发者阅读本文。


实现思路


接下来,我们来分析下字符串与规则之间的比对思路:


  • 比对两个字符串同一位置的字符:同位置的字符相等或者当前位置的字符为.则满足相等条件
  • 规则字符数>1且当前字符串的下一位字符等于*,则执行下述两个条件,满足任意一个即可:
  • 字符串保持不变,从规则字符的下下位开始递归(*前面的字符可以出现任意次数,故从*后面开始寻找)进行比对获取结果
  • 同位置的字符符合相等条件且规则字符串保持不变从字符串的下一位开始递归进行比对获取结果
  • 否则,同位置的字符符合相等条件且从字符串与匹配字符的下一位开始递归进行比对获取结果


我们将上述思路代入前言的例子中,它的递归栈就如下图所示:

640.png

                                 image-20220328220443088


实现代码


有了思路后,我们就可以愉快的写出代码了,如下所示(完整代码请从 示例代码 章节获取):


/**
   * 匹配.与*的正则表达式
   *  1. .代表可以匹配任意字符
   *  2. *代表它前面的字符可以出现任意次数
   * @param str
   * @param pattern
   */
  public match(str: string, pattern: string): boolean {
    if (pattern.length === 0) {
      return str.length === 0;
    }
    // 相同位置的字符相等或者当前位置的字符为.代表匹配成功
    const matchResult =
      str.length > 0 &&
      (str.charAt(0) === pattern.charAt(0) || pattern.charAt(0) === ".");
    // 有*
    if (pattern.length > 1 && pattern.charAt(1) === "*") {
      // *前面的字符可以出现任意次数,故:从*后面开始寻找递归寻找
      return (
        this.match(str, pattern.substring(2)) ||
        (matchResult && this.match(str.substring(1), pattern))
      );
    } else {
      // 无*
      return matchResult && this.match(str.substring(1), pattern.substring(1));
    }
  }


接下来,我们写一个测试用例,将前言中的例子代入,再举一个不符合条件的例子(完整代码请从 示例代码 章节获取)


const regExprMatch = new RegExprMatch();
let result = regExprMatch.match("dpaaab", "d.a*b");
console.log("匹配结果", result);
result = regExprMatch.match("dsaaap", "d.a*b");
console.log("匹配结果", result);


执行结果如下所示:


640.png

                              image-20220328221746809


示例代码


本文所用代码的完整版本请移步:


  • RegExprMatch.ts[1]
  • regExprMatch-test.ts[2]


写在最后


至此,文章就分享完毕了。


我是神奇的程序员,一位前端开发工程师。


如果你对我感兴趣,请移步我的个人网站[3],进一步了解。

  • 文中如有错误,欢迎在评论区指正,如果这篇文章帮到了你,欢迎点赞和关注😊
  • 文中链接可从文末参考资料中获取
相关文章
|
3月前
|
算法 测试技术 C#
【动态规划】【字符串】C++算法:正则表达式匹配
【动态规划】【字符串】C++算法:正则表达式匹配
|
3月前
|
算法 C#
Leetcode算法系列| 10. 正则表达式匹配
Leetcode算法系列| 10. 正则表达式匹配
|
4月前
|
算法
【面试算法——动态规划 21】正则表达式匹配(hard)&& 交错字符串
【面试算法——动态规划 21】正则表达式匹配(hard)&& 交错字符串
|
6月前
|
算法 C++
剑指offer(C++)-JZ19:正则表达式匹配(算法-动态规划)
剑指offer(C++)-JZ19:正则表达式匹配(算法-动态规划)
|
9月前
|
算法 Python
【力扣算法03】之正则表达式匹配- python
【力扣算法03】之正则表达式匹配- python
59 0
|
存储 算法
将数组a中数据元素实现就地逆置的算法
给出将整型数组a中数据元素实现就地逆置的算法。所谓就地逆置,就是利用数组a原有空间来存放数组a中逆序排放后的各个数据元素。
260 0
|
JavaScript 算法 前端开发
【前端算法】JS实现数字千分位格式化
JS实现数字千分位格式化的几种思路,以及它们之间的性能比较
276 1
|
算法 前端开发 JavaScript
【前端算法】用JS实现快速排序
理解数组方法里面运用到的算法,splice 和 slice的区别
113 0
|
JavaScript 前端开发 算法
【前端算法】javaScript实现二分查找
如何使用JS实现一个合格的二分查找
191 0
|
存储 算法 前端开发
【前端算法】链表和数组实现队列的区别
比较链表和数组实现队列的性能
161 0