JS正则表达式详解RegExp

大前端基础之JS正则表达式

先来个常用的8到16位高级密码正则表达式
/^(?=\D+\d)(?=.[a-z])(?=.[A-Z])[a-zA-Z0-9]{8,16}$/
解释
(?=\D+\d) 条件是首字母不能是数字,但是整个字符串中必须含有1个数字
(?=.[a-z]) 必须包含一个小写字母,字母可以在任意位置*
(?=.*[A-Z]) 必须包含一个大写字母,字母可以在任意位置
[a-zA-Z0-9]{8,16} 大小写字母和数字字符最少8个,最多个16


正则表达式
作用: 查找、替换,通常用作验证,截取,隐藏,编码
一、正则表达式的创建
1、字面量写法
var reg=/表达式/修饰符
var reg=/ab/g;
修饰符
1)g 全部
2)i 不区分大小写
3)m 多行匹配
2、构造函数创建方法
var reg=new RegExp(“表达式”,“修饰符”);
var reg=new RegExp(“ab”,“g”);
第二种方法实际上是将一个字符串转化为正则对象

二、正则表达式的方法 test exec
1、 test 查看字符串是否有满足正则表达式的内容,会查完,查一次,如果有,返回true,没有就返回false。
var bool=reg.test(“abcde”);

这里indexOf和text都可以执行,等同,但是一个是返回下标,一个是返回布尔值。

var str=“eksdakjdksdh”;
if(str.indexOf(“sa”)>-1){
console.log(“这个字符串中有sa字符”);
}
if(/sa/.test(str)){
console.log(“这个字符串中有sa字符”);
}
2、exec 查找符合正则内容 ,index就是下标,返回一个以查找到的值为属性值的数组,没找到就会返回null。
不能查找多个

var str=“eksakjdksadh”;
console.log(/sa/g.exec(str)); Array(1)==>0:“sa”

三.字符串用在的正则表达式中的方法
1、replace 替换, 替换字符"z"也可以为函数,返回一个改变后的字符串,原字符串不变。
var str=“abcedg”;
str.replace(/a/,“z”);
var str=“abcdabcd”;
replace 字符替换
str=str.replace(/a/,“z”);//单字替换
str=str.replace(/a/g,“z”);//多个替换

    str=str.replace(/[ac]/g,"z");
    str=str.replace(/[ac]/g,function(item,index){
        // replace后面的函数  参数有2个,第一个是查找到的元素,第二个是下标
        // 这个函数中return 的结果就是这个对于的字符串要替换成什么
        if(item==="a") return "x";
        if(item==="c") return "y";
    })

2、 match查找返回数组
var str=“abcdabcd”;
str.match(/a/);
console.log(str.match(/a/));//查找一个时,与test类似,可以返回一个数组,下标和查找到的内容
console.log(str.match(/a/g));//查找多个,就会把每个查找到的内容返回出来

3、 search查找元素,返回下标
var str=“abcdabcd”;
str.search(/a/);
console.log(str.search(/c/));//只能找到一个正则表达式的下标

4、 以a分割字符串,返回数组。此时a在首位的时候,以a分割,a前面还有一个空字符,所以会分成为 [0:"",1:“bcedg”]
var str=“abcedg”;
str.split(/a/);

四、正则表达式基础
1、元字符
var reg=/abc/;
abc就是元字符,要求必须包含a接下来是b,再接下来是c的字符

2、 通配符点 . 任意一个字符
var reg=/c.t/g; c接下来的字符任意一个,然后在接上t;
“cdtcat”.match(reg); ==》cdt和cat

var reg=/a./g
var str="ababdeaf";
str=str.replace(reg,"az");
console.log(str);  //azazdeaz 

3、 \反斜杠,将在正则里有特殊意义的字符改为正常字符;
当遇到 \内容 相当于将内容转换为字符 \ 表示\字符

4、[],群组选择符,满足[]内任意一个字符 ,中括号内代表任意一个字符
var str=“a&tacta1tadtalt”;
console.log(str.match(/a.t/g));//输出结果为[0:a&t,1:act,2:a1t,3:adt,4:alt]
console.log(str.match(/a[abcdef]t/g));a接上[abcdef]中的任意一个字符再接上t

    // [0-9]  [0123456789]
    // [a-z]  
    // [A-Z]
    // [a-zA-Z]  
    // [a-Z]  错误的   小写字母的编码数字大,大写编码小
    // [A-z]  错误的    Z到a直接还有其他字符
    // /[A-Za-z0-9]/
    // console.log(String.fromCharCode(0x4e03))
    // /[\u4e00-\u9fa5]/  匹配中文,其中\代表16进制0x

. 这个通配符在[]内不需要转义,因为在中括号内.就是字符.不是通配符

    // 不管中括号中有什么内容,都只代表着一个字符
    // console.log("1231".match(/[1-31]/g));//123 多出1重复无效
    除了通配符. 以外在[]内其它符号仍需要转义 [,],这两个字符也需要转义
// console.log("a[b]c".match(/[\[\]]/g));

5、 反义字符 ^
[^0-9] 除了数字以外的所有字符
/[^a-zA-Z]/ 除了字母以外
/[a^cb]/ 如果反义字符不是[]的第一位,就代表反义字符字符。实际这个是匹配 acb^,四个字符中任意一个

    // /\w/   ===  /[a-zA-Z0-9_]/
    // /\W/   ===  /[^a-zA-Z0-9_]/
    
    // /\d/  === /[0-9]/;
    // /\D/  === /[^0-9]/;

    // /\s/ === / /    空格
    // /\S/  非空格
    // console.log("a c".match(/\s/));     

    \b 单词分隔符
    \B 非单词分隔符
// 单词分隔符并不是空格,是英文单词之间的间隙

单词分隔符和非单词分隔符
结果

6、 重复 {}
var str=“caaaaaaat”;
和a{7}一样的效果,a重复7次
console.log(/ca{7}t/.test(str));//true;

   eg:
    重写: /[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]/
    1、 /\d\d\d\d-\d\d-\d\d/
    2、 /\d{4}-\d{2}-\d{2}/
    3、 /\d{4}(-\d{2}){2}/  //里面的-也重复

    // 任何内容重复0次,就是""    a{0}   z{0}  9{0}   都是""
    // console.log("asajhdksahd".split(/a{0}/));==》以10个元素为长度的空字符组成的数组
    // console.log("aaaaa".match(/a{0}/g)); a{0}为"";
    // console.log("aaaaa".match(/aa{0}/g));//  aa{0}   --->a""--->a  如果没有(),{}针对前一个,

    // /[a{2}]/   这样并不是重复,[]里面是代表一个字符  这里代表a,{,2,},4个字符任意一个
    


    var str="caat";  //希望可以满足  caat,caaat,caaaat,caaaaat
    // 要满足这样重复次数就不确定最小重复2次,最多重复5次
     console.log(/ca{2}t/.test(str)); //一个参数代表重复n次;
    console.log(/ca{2,5}t/.test("cat"));false//最少重复2次,最多重复5次 

    // {0,1}  有或者没有这个字符都可以
     console.log(/cats{0,1}/.test("cat"));//true;
     console.log(/cats{0,1}/.test("cats"));//true;

   扩展:
    // 最大优先匹配   贪婪匹配
    console.log("aaaaaaaaab".match(/a{0,4}/g));//这里会匹配到最大的位数。

    // 最少2个,最多不限
    console.log("caaaaaaaaaat".match(/ca{2,}t/));
    console.log("aaaaaaaaaaaa".match(/a{0,}/g));

    // /ca{0,}t/ ===  /ca*t/               {0,}     *  有或者没有,有多少个都可以
    // /ca{1,}t/ ===  /ca+t/               {1,}     +  有至少一个以上
    // /ca{0,1}t/ === /ca?t/               {0,1}    ?  有或者没有都行,最多1个


      // 非贪婪匹配
    console.log("caataaaataaaaat".match(/c.*t/)); ==》贪婪匹配选择符合条件的全部
    console.log("caataaaataaaaat".match(/c.*?t/));==》非贪婪匹配选符合条件的最小一个caat

    更深一层理解:
    console.log("<div><span></span></div><a></a>".match(/<\/?[a-z]+>/g));
    console.log("<div><span></span></div><a></a>".match(/<\/?.+>/g));//两种效果一样,只有一个,匹配全部 [0:<div><span></span></div><a></a>]
    // 非贪婪匹配  在+号后面加里?  表示取最少
    // console.log("<div><span></span></div><a></a>".match(/<\/?.+?>/g));[0:"<div>" 1:"<span>" 2:"</span>" 3:"</div>"  4:"<a>" 5:</a>]

7 起始符^和结束符$;
^ 写在[]内叫反义,写在中括号外最前叫做起始
$ 写在正则最后叫做结束

8 | 或者 依次进行匹配,一般和()一起使用;

console.log("abac".match(/a[bc]/g)); //ab或者cd
console.log("abcd".match(/ab|cd/g)); //ab或者cd
console.log("abcd".match(/a|b|c|d/));相当于 /[abcd]/
  // |写在前面先匹配,然后再向后匹配,匹配一次;
console.log("abcd".match(/ab|cd|/g));//当多写一个或者符号,最后一个代表或者一个""
console.log("abcd".match(/ab||cd/g));//[0:ab,1:"",2:"",3:""];
//当在中间多写一个或者符号,代表或者一个"",这样匹配完""后,cd就不匹配了
console.log("abcd".match(/|ab|cd/g));//[0:"",1:"",2:"",3:"",4:""]
//当多写一个或者符号,代表或者一个"",这样匹配完""后,ab和后面的cd就不匹配了

9、 ?= ?! ?<= ?<!当然,这里的?是英文状态上的?;
?= ?! 紧邻其后
console.log(“abad”.match(/a(?=d)/g)); //Array(1)[0:a];
var str=“abad”.replace(/a(?=d)/,“z”);//abzd;判断条件前的字符是否为判断紧邻其后的字符。
var str=“abadac”.replace(/a(?!d)/g,“z”); ==>azadaz错误的; 正确的是zbadzc ;修改的是a,这里表示判断条件前的字符非在判断紧邻其后的字符,()里面是条件
?<= ?<! 前置条件
var str=“abcbdb”.replace(/(?<=c)b/g,“z”);//abczdb,满足b前面的是c的b
var str=“abcbdb”.replace(/(?<!c)b/g,“z”);

10 、 () 群组
1) 将a,b,c使用()后,分别被分为3个组,只有在不使用g全局的情况match可以看到
2) 当使用分组时,不要使用g全局匹配
3) 分组的顺序是从外向内,从前向后
console.log(“abc”.match(/(a(b)c)/)) 会返回 “abc” “abc” “b”;

   eg:
    修改号码中间的 "186****7689"
    var str="18675467689";
     $1  是群组1   $3 是群组3
    console.log(str.match(/^(\d{3})(\d{4})(\d{4})$/))
    str=str.replace(/^(\d{3})(\d{4})(\d{4})$/,"$1****$3");

11、 - 范围 a-z 0-8之间 一般和[]配合

12、 [\u4e00-\u9fa5] 匹配中文

13 、 正则表达式中的比较常用的验证方法

     用户名
     /^\w{8,16}$/

    邮箱验证
     /^\w{5,}\@[a-zA-Z0-9]{2,}\.(com|net|org)(\.cn)?$/

     电话号码
     /^1\d{10}$/

     网址验证
     /^https?:\/\/www\.\w+\.\w+$/

 eg:
 	var str = "<p>Uber的这款无人车原型配备了多个<strong>摄像头</strong>、<em>激光雷达</em>以及<span>传感器</span>,可看清100米范围内任何方向的东西</p><br/><p>第二行内容,哎嘿,第二行内容</p>";
    //要求: 把里面除<br />之外所有的标签去掉,如果标签是br 则换成\n
    str=str.replace(/<\/?(.+?)\/?>/g,function(a,b,c){
        if(b.indexOf("br")>-1) return "\n";
        return "";
    }); // 这里的reture结果就是替换内容

回顾贪婪匹配和非贪婪匹配:    
    var str="#ak%as#sdakh2#18371283#...#"
    // 贪婪匹配
    console.log(str.match(/#.*#/)) 这里取最长的
    // 非贪婪匹配
    console.log(str.match(/#.*?#/)) 这里取最短的

来个压轴,常用的表单验证

 var form=document.querySelector("form");
     // 获取所有的input列表转换为数组
     var list=Array.from(document.getElementsByTagName("input"));
     list.pop();
    var arr=[];
    for(var i=0;i<list.length;i++){
        // 初始化让每个元素都标示没有验证通过,都是false
        arr.push(false);
    }
    form.addEventListener("submit",formHandler);
    form.addEventListener("input",formHandler);

    function formHandler(e){
        if(e.type==="input"){
            // 获取当前input触发文本框是数组中第几个
            var index=list.indexOf(e.target);
            // 执行验证,带入当前是第几个文本框,文本内容
            var bool=getVerify(index,e.target.value);
            // 本次验证文本内容是否正确
            if(bool){
                // 如果正确就让本次验证内容后面的元素span添加内容改变颜色
                e.target.nextElementSibling.textContent="正确的";
                e.target.nextElementSibling.style.color="green";
            }else{
                // 如果不正确提示错误,红色
                e.target.nextElementSibling.textContent="错误的";
                e.target.nextElementSibling.style.color="red";
            }
            // index是当前验证元素list列表的第几个元素
            console.log(arr,index);
            // 让arr数组的对于顺序标示为是否验证正确
             // 数组中对于下标顺序,对于的input顺序位置标示当前验证是否正确
            arr[index]=bool;
        }else if(e.type==="submit"  && arr.indexOf(false)===-1){
            // 这个条件  提交事件时
            // 数组中是否有false
            
        }else{
            e.preventDefault();
            console.log("请输入正确后再提价");
        }
      
    }

    function getVerify(index,value){
        switch(index){
            case 0:
            return /^\w{8,16}$/.test(value);
            case 1:
            return /^1\d{10}$/.test(value);
            case 2:
            return /^1\d{10}$/.test(value);
        }
    }

喜欢小编的请动动您的小金指哦,您的鼓励就是我的动力,欢迎留言评论,不喜误喷哦。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值