• 正则表达式元字符(精华版)


    正则表达式分为元字符和修饰符,修饰符有三个,本文中说说对于元字符的理解。

    1. . 通配符, 匹配任何一个字符
      变为字符的方法: a.放在[]中 b.. 利用转义字符
    var str="catcbtc/tc1tc.tcabt";
    console.log(str.match(/c.t/g));  //["cat", "cbt", "c/t", "c1t", "c.t"]
    console.log(str.match(/c.t/g)); //[c.t]
    console.log(str.match(/c[.]t/g));  //[c.t]
    

    2.[] 或者符,匹配其中任意一个

    var str="catcbtc/tc1tc.tcabt";
    console.log(str.match(/c[abcdefghi]t/g))  //["cat", "cbt"]
    console.log(str.match(/c[a-i]t/g))       //["cat", "cbt"]
    

    应用举例

    var str="中国四大古典名著有'西游记','红楼梦','水浒','三国演义'";
    str=str.replace(/'/g,function(item){
                return n++%2===0 ? "《" : "》";
    });
    console.log(str);   //"中国四大古典名著有《西游记》,《红楼梦》,《水浒》,《三国演义》"
    
    
    str=str.replace(/[《》]/g,function(item){
                return item==="《" ? "<" : ">";
    });      
    console.log(str);   //"中国四大古典名著有<西游记>,<红楼梦>,<水浒>,<水浒>"
    

    3. 相当于字符

    两个 在字符或者正则表达式的[]都是一个
    console.log("aa\aa".match(/[\]/g))  //  [""]
    

    4.^ 不要后面的字符,但只能在[]的第一个字符位置才起此作用,在中间位置,作为字符的作用

    console.log("abc^def".match(/[^^]/g));//   ["a", "b", "c", "d", "e", "f"]    不要^
    

    5.贪婪匹配

    console.log("aaaaaaa".match(/a{1,4}/g)); // ["aaaa", "aaa"]    先匹配最大的字符串  贪婪匹配
    console.log("aaaaaaa".match(/a{0,3}/g))  // ["aaa", "aaa", "a", ""]  因为0是最小,匹配空字符
    

    7.简写

    a:常规简写
    1)w     [a-zA-Z0-9_]     W     [^a-zA-Z0-9_] 
    2)d     [0-9]            D     [^0-9]
    3)s     空字符           S      不要空字符   
    //大写和小写是相反的
    b:贪婪匹配简写
    1)*   /a*/g     /a{0,}/g   可以没有,可以有若干个
    2)+   /a+/g    /a{1,}/g    匹配至少1个也可以多个
    3)?   /a?/g    /a{0,1}/g   可以有也可以没有
    

    8.非贪婪匹配
    和贪婪匹配的区别: 区分符号为 ? 当使用了贪婪匹配,也就是字符重复了,后面加 ? ,就是非贪婪,选取最小的
    常见: *? +? {3,}?
    例如:

    var str = "<p>Uber的这款无人车原型配备了多个<strong>摄像头</strong>、<em>激光雷达</em>以及<span>传感器</span>,可看清100米范围内任何方向的东西</p><br/><p>第二行内容,哎嘿,第二行内容</p>";
    str=str.replace(/<.*?>/g,function(item){
      if(item==="<br/>") return "
    ";
      return "";
    });
    console.log(str);   //   去掉所有的标签 换行
    

    9.() 群组

    1)当使用match时,如果使用群组,加上g和不加g是有差距
    不加g可以将每个()群组的内容单独拿出来,在数组中按照顺序从下标1 开始放置
    加g就不能找到群组内容,只有满足正则的内容,()内的内容不能查找
    
    console.log("10[a]3[bc]".match(/(d+)[([a-zA-Z]+)]/g))  // ["10[a]", "3[bc]"]
    console.log("10[a]3[bc]".match(/(d+)[([a-zA-Z]+)]/g))  //["10[a]", "10", "a", index: 0, input: "10[a]3[bc]", groups: undefined]
    
    
    2)在replace中如果不使用群组,后面的函数中参数第一位时符合正则内容,第二位是这个字符的下标
    使用了群组,后面的函数中参数分别是符合正则的内容,和每个群组的内容
    var str="10[a]3[bc]".replace(/(d+)[([a-zA-Z]+)]/g,function(item1,item2,item3){
    return item3.repeat(item2);  // 把item3重复item2个数量,这里 item2对应的是 10 3  item3对应的是 a  bc  ,然后替换item1,也就是满足正则的内容
    }
    console.log(str)   //aaaaaaaaaabcbcbc
    
    //替换字符内容
    var str="background-position-x".replace(/-([a-z])/g,function(item,item1){
        return item1.toUpperCase();
    });
     console.log(str);  // backgroundPositionX
    
    //隐藏手机号
    var str="13879061235".replace(/(d{3})d{4}(d{4})/,"$1****$2");  
    console.log(str);     //138****1235  群组会默认按照顺序把内容 赋予变量,只能使用$1,$2....等
    
    1. 1 重复
      变成数组,排序,转回字符串,查找重复字符
    用法:   ([a-z])1*   ([a-z])1+
    var str="aaabbffddeeaaggfddssaaggeer".split("").sort().join("").match(/(w)1*/g).reduce(function(value,item){
       value+=item[0]+"["+item.length+"]";
        return value;
    },"")
    console.log(str);   // a[7]b[2]d[4]e[4]f[3]g[4]r[1]s[2]
    
    1. ^开始 $结束
      要完成一个全体内容匹配就需要使用起始和结束符来操作 : 例如表输入框
    console.log("bbaacc".match(/^a+/g));//  要求起始就需要是一个a以上
    console.log("bbaacc".match(/c+$/g));//  要求必须以某个字符结束
    

    12.| 或者(选择) || 两个||中间表示空字符 是按照顺序查找的

    console.log("abcd".match(/ab||cd/g));  // ["ab", "", "", ""]
    
    1. 断言
    a(?=b)  前瞻断言  查找后面紧跟b的a字符
    a(?!b)  前瞻断言  查找后面没有紧跟b的a字符
    (?<=a)b 后瞻断言  查找前面是a的b字符
    (?<!a)b 后瞻断言   查找前面没有a的b字符 
    
    
    console.log("abac".replace(/a(?=b)/g,"z"));  // zbac  
    console.log("abac".replace(/a(?!b)/g,"z"));  // abzc
    console.log("abcb".replace(/(?<=a)b/g,"z"));  //azcb
    console.log("abcb".replace(/(?<!a)b/g,"z"));  //abcz
    

    花了几个小时时间,只整理成了这个样子,真心累,发现了好多以前没注意到的地方。

    正则表达式的作用很广泛,每门语言都有自己处理字符串的名字,但是方法总的来说,就是这些。

    我是做前端的,所以只整理了关于js的方法,但是殊途同归。整理的没有多好,只是些简单的使用方法和

    认识,希望这几个小时的时间没有白费,可以为看到这篇文章的各位提供帮助。

    第9点应用到了replace的方法,这也是replace的第三种使用方法,关于前两种使用方法,在我前面的一篇文章。

    https://www.cnblogs.com/94-Lucky/p/13356817.html

  • 相关阅读:
    循环排序总结
    # 区间合并总结
    快慢指针
    #双指针总结
    滑动窗口总结
    leetcode 第 221 场周赛
    剑指 Offer 07. 重建二叉树
    leetcode 406. 根据身高重建队列
    [JLOI2014]松鼠的新家 T22 D71
    软件包管理器 T21 D71
  • 原文地址:https://www.cnblogs.com/94-Lucky/p/13357295.html
Copyright © 2020-2023  润新知