正则表达式一些笔记

1:正则\1\2的理解
‘\1’ 匹配的是 所获取的第1个()匹配的引用。例如,’(\d)\1’ 匹配两个连续数字字符。如33aa 中的33
‘\2’ 匹配的是 所获取的第2个()匹配的引用。
例如,’(\d)(a)\1’ 匹配第一是数字第二是字符a,第三\1必须匹配第一个一样的数字重复一次,也就是被引用一次。如9a9 被匹配,但9a8不会被匹配,因为第三位的\1必须是9才可以,

‘(\d)(a)\2’ 匹配第一个是一个数字,第二个是a,第三个\2必须是第二组()中匹配一样的,如,8aa被匹配,但8ab,7a7不会被匹配,第三位必须是第二组字符的复制版,也是就引用第二组正则的匹配内容。

//编程题,找出字符串中连续出现最多的字符和个数
//'abcaakjbb' => {'a':2,'b':2}
//'abbkejsbcccwqaa' => {'c':3}

      let str = "aaabb333cccc35";
      const arr = str.match(/(\w)\1*/g);
      const maxLen = Math.max(...arr.map((s) => s.length));
      const result = arr.reduce((pre, curr) => {
        if (curr.length === maxLen) {
          pre[curr[0]] = curr.length;
        }
        return pre;
      }, {});

2:解析正则表达式中的.,.?,.+?的含义
2.1:(.
. 表示匹配除换行符 \n 之外的任何单字符,表示零次或多次。所以.在一起就表示任意字符出现零次或多次。没有?表示贪婪模式。比如a.b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
2.2:(.
?)
?跟在
或者+后边用时,表示懒惰模式。也称非贪婪模式。就是匹配尽可能少的字符。就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
a.
?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。
2.3:( .+?)
?跟在
或者+后边用时,表示懒惰模式。也称非贪婪模式。就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
a.+?b匹配最短的,以a开始,以b结束的字符串,但a和b中间至少要有一个字符。如果把它应用于ababccaab的话,它会匹配abab(第一到第四个字符)和aab(第七到第九个字符)。注意此时匹配结果不是ab,ab和aab。因为a和b中间至少要有一个字符。

      //代码示例
        const getType = (s) => {
          return Object.prototype.toString
            .call(s)
            .replace(/\[object (.*?)\]/, "$1")
            .toLowerCase();
        };
        console.log(getType(new Number(1))) //number

3:手机号脱敏实现

      const tel = "12345678901"
      const tel1 = tel.replace(/(\d{3})(\d{4})(\d{4})/,"$1****$3")
      const replacer = function(match,p1,p2,p3,offst,string){
          return p1 + "****" + p3
      }
      const tel2 = tel.replace(/(\d{3})(\d{4})(\d{4})/,replacer)
      console.log(tel1);//123****8901
      console.log(tel2);//123****8901
上一篇:数据结构入门8 - 链表『反转链表 | 删除排序链表中的重复元素』


下一篇:算法练习(9)-复杂带随机指针的单链表