Regular_Expressions初识【JavaScript】【正则】

141 阅读2分钟

引子示例

如何查找字符串中的数字

var str='ilove283youvery87muchbaby77doyoubleve222me11';
        // function findNum(str){
        //     var arr=[];
        //     var tmp='';
        //     for(var i=0;i<str.length;i++){
        //         if(str.charAt(i)>='0'&&str.charAt(i)<='9'){
        //             // arr.push(str.charAt(i));
        //             tmp+=str.charAt(i);
        //         }else{
        //             if(tmp){
        //                 arr.push(tmp);
        //                 tmp='';  
        //             }
        //         }
        //     }
        //     if(tmp)arr.push(tmp);
        //     return arr;
        // }
    function findNum(str){
        return str.match(/\d+/g);
    }
    alert(findNum(str));
        

正则的定义

2种方式

var re = /a/;
var re= new RegExp('a');

正则中的一些转义字符

\s : 空格 <br/>
\S : 非空格<br/>
\d : 数字<br/>
\D : 非数字<br/>
\w : 字符(包括字母、数字、下划线)<br/>
\W : 非字符<br/>
========================
. :任意字符 <br>
\. :真正的点 
\b :独立的部分(包括:起始、结束、空格)
\B :非独立的部分
    var str2='helloworld';
    var re2=/\bhello\b/;
    alert(re2.test(str2)); //false

一个小示例-边界

      var ul=document.getElementById('ul');
      var ali=ul.getElementsByTagName('li');
      var re=/\bone\b/;
      for(var i=0;i<ali.length;i++){
          if(re.test(ali[i].className)) {
              ali[i].style.backgroundColor='red';
          }
          
      }

正则的方法

4类方法:test、search、match、replace
test方法:判断是否匹配,常用于判断

        var nons='comonmysi!d3k';
        var re1=/\d/;
        var re2=/\W/;
        if(re1.test(nons)){alert('字符中有数字');}
        if(re2.test(nons)){alert('字符中也有非字符');}

search方法:
正则表达式去匹配字符串,如果成功,返回匹配成功的位置;如果失败,返回-1。
正则中默认区分大小写,若不区分大小写,在正则最后加标识i
var re=/B/i;
var re=new RegExp('B','i');

        var arr='00iblove!you';
       var re=/B/i;
       alert(arr.search(re));//1
       var re1=new RegExp('B','i');
       alert(arr.search(re1));

match方法:
正则匹配字符串,成功,返回匹配成功的数组;失败,返回null
默认:正则匹配成功就会结束,不继续匹配;如果全部查找,加标识g(全局匹配)

        var re=/\d+/g;
        alert(arr.match(re));

replace方法:
正则去匹配字符串,匹配成功的字符去替换成新的字符

        var str='aaa';
        var re=/a/;
        // alert(str.replace(re,'b')); //baa
        var re1=/a/g;
        // alert(str.replace(re1,'b')); //bbb
        var re2=/a+/;
        alert(str.replace(re2,'b')); // b

replace应用:和谐敏感字
replace的第二个参数可以是一个回调函数,该函数的第一个参数是匹配成功的字符

var arr='···';
var re=/男足|主教练|价值/g;
        // var arr_gt=arr.replace(re,'*');
        var arr_gt=arr.replace(re,function(str){
            var m=str.length;
            var bb='';
            for(i=0;i<m;i++){
                bb+='*';
            }
            return(bb);
        })
        btn.onclick=function(){
            aTareas[1].innerHTML=arr_gt;
        }

正则-匹配子项

  1. 正则中匹配子项用()表示
  2. 第一个()里的内容叫第一个子项
  3. 第2个()里的内容叫第2个子项
        var date='2021-09-06';
        var re=/\d-/g;
        // alert(date.match(re));//1-,9-
        var re1=/\d+-/g;
        // alert(date.match(re1)); //2021-,09-
        var re2=/\d-+/g;
        // alert(date.match(re2));//1-,9-
        var re3=/(\d+)(-)/g;
        date.replace(re3,function($0,$1,$2){
            // $0:正则的整体;$1:第一个子项;$2:第二个子项
            // console.log($0); //2021- 09-
            // console.log($1); //2021  09
            console.log($2); // - -
            
        })
        var str=date.replace(re3,function($0,$1,$2){
            return($1+'.');
        })
        alert(str); // 2021.09.06

match方法的匹配子项

        var str='abc';
        var re=/abc/;
        // alert(str.match(re)); //abc
        var re1=/(a)(b)(c)/;
        // alert(str.match(re1)); //abc,a,b,c
        var re2=/(a)(b)(c)/g;
        alert(str.match(re2));//abc 不加g时,match才可以取到子项的集合

正则-字符类

正则表达式中的字符类:一组类似的字符(元素),用[]表示
任意字符[abc]
范围[a-z]/[0-9]
排除[^a]:^写在[]内部,代表排除。例子o[^0-9]t 可代表 oat o?t o t 
    var str='abc';
    var re=/a[bfg]c/;
    // alert(re.test(str));
    var str2='aoy';
    var re2=/a[^mno]y/;
    alert(re2.test(str2)); //false

正则-重复子项

\1 重复子项:重复的第一个子项 
\2 重复的第二个子项
var re=/(b)(a)(c)\2/; 此处\2 代表a 
注意:重复子项和重复的子项是完全一致的,注意下发的区别:
    var re =/\w\w/;
    var re = /(\w)\1/;
    ========================================
    var str='baca';
    var re=/(b)(a)(c)\2/;
    alert(re.test(str)); // true

重复子项的小应用

        var str='hellogirliloveyouverymuchpleasemarryme!';
        var arr=str.split('');
        str=arr.sort().join('');
        // alert(str);
        var num=0;
        var value='';
        var re=/(\w)\1+/g;
        str.replace(re,function($0,$1){
            // alert($0);
            if(num<$0.length){
                num=$0.length;
                value=$1;
            }
        })
        alert('重复最多的字符是:'+value+',次数是:'+num) // 重复最多的字符是:e,次数是:6

正则-量词

量词:不确定字符的个数,用{}表示
{4,7}最少出现4次,最多出现7次
{4}正好出现4次
以下意义一致的3组: + {1,} ; ? {0,1} ; * {0,}
^在正则起始位置,开始;$在正则结束位置,结束

一些常用的表达式

       中文:[\u4e00-\u9fa5]
       行首行尾空格:^\s*|\s*$
       email: ^\w+@[a-z0-9]+(\.[a-z]+){1,3}$
       网址:[a-zA-Z]+://[^\s]*
       邮编:[1-9]\d{5}
       qq:^[0-9]\d{4,11}$

命名空间:把方法包在一个空间里

       var re={chinese:'[\u4e00-\u9fa5]',email:'^\w+@[a-z0-9]+(\.[a-z]+){1,3}$'}
       console.log(re.chinese);
       console.log(re.email);