小白看的正则。

314 阅读3分钟

正则在JS中 是一种专门用来处理字符串的 类;可以理解成字符串的规则;正则只能用来处理字符串

编写正则有两种:字面量 构造函数

正则的组成部分:元字符 修饰符

元字符分为:特殊元字符 量词元字符 普通元字符

正则处理字符串:匹配(字符串满不满足正则的条件)test 捕获(把满组正则条件的字符获取到)exec,正则的 lastIndex 属性 是 定义了 下一次捕获开始的位置

常用的有特殊含义的元字符

    \       代表转义
    .       代表除了换行之外的所有字符
    \d      代表0-9之间的数字
    \w      代表数字 字母  下划线
    ^       代表以什么开头
    $       代表以什么结尾
    [ab]    代表a或b
    [a-z]   代表a到z 也就是小写字母
    [^ab]   代表除了a和b
    [^a-z]  代表除了小写字母
    a|b     代表a或b
    ()      代表分组,捕获时常用,在匹配是可以提升优先级
    (?:)    只匹配 不捕获
    (?=)    只匹配 不捕获  正向预查
    (?!)    只匹配 不捕获  负向预查  

量词元字符 使用在对应的元字符的后边

    ?       代表对应的字符出现0或1次
    *       代表对应的字符出现0或多次
    +       代表对应的字符出现1或多次
    {n}     代表对应的字符出现n次
    {n,m}   代表对应的字符出现n到m次
    {n,}    代表对应的字符至少出现n次

修饰符 用在两个斜杠的后边

   i     忽略大小写     
   m     多行匹配  
   g     全局匹配  

验证有效数字

整数  负数 小数 
/^[-+]?(([1-9]\d*)|0)(\.\d+)?$/

验证手机号码

数字1开头  第二位是3|5|6|7|8|9   共11位
/^1[356789]\d{9}$/

验证QQ邮箱的正则

前面是QQ号码   后面是@qq.com
/^[1-9]\d{4,10}@qq\.com$/

验证身份证号码

共18位  最后一位可能是X
/^[1-9]\d{5}\d{4}\d{2}\d{2}\d{2}\d(\d|X)$/

验证密码

6-16位   是数字  字母下划线
/^\w{6,16}$/

自己封装一个 execAll的方法 可以 一次性把所有的符合条件的内容捕获到

    RegExp.prototype.execAll = function (str='') {
        // 首先查看对应的正则有没有 修饰符 g
        if(!this.global){
            // 代表正则没有修饰符g
            throw new Error('您的正则没有修饰符g 不能使用该方法')
            return; 
        }
        // 怎么保证str是字符串?
        str = str.toString();
        // this --->  reg2
        var res = this.exec(str);
        var ary = [];
        while(res){
            ary.push(res);
            res = this.exec(str);// 每次while循环都要更新res;
        } 
        return ary
    }

封装一个getCookie的方法 使用 execAll getCookie位于 字符串的原型上

   String.prototype.getCookie = function(key){
       var reg = /([^; ]+)=([^; ]+)/g;
       var ary = reg.execAll(this);
       // 把数组ary中的每一项 转成对象的格式
       var obj = {};
       ary.forEach(item=>{
           // item 数组中的每一项; 都是一个小数组
           obj(item[1])
           = item[2]
       })
       return key ? obj[key] : obj
   }

贪婪性和懒惰性

  • 懒惰性 找到一次符合规则的字符串之后 就不再向后捕获了

  • 怎么解决懒惰行 ?? 修饰符g

  • 贪婪性 一次把所有符合条件的都拿到

  • 怎么解决贪婪性 ?? 对应元字符的末尾加一个?

  • 懒惰性就是只获取一次,贪婪性就是 一次尽量多的获取;

match

返回数组 match 是字符串的方法,当正则不加全局修饰符的时候; 效果跟 exec 是一样的 但是加上全局修饰符g之后,match只会捕获到所有的大正则匹配的内容 match(有g的时候)的 优点是把大正则的内容全部捕获到 缺点是不能捕获小分组

replace

  • replace 的两种用法 在于第二个参数可以是字符串 也可以是 回调函数

  • 若是字符串 则表达的含义就是 用该字符串去替换 当前正则匹配到的内容

  • 若是函数 则表达的含义就是 用该回调函数的返回值 去替换当前正则匹配到的内容的两种用法 在于第二个参数可以是字符串 也可以是 回调函数

  • 若是字符串 则表达的含义就是 用该字符串去替换 当前正则匹配到的内容

  • 若是函数 则表达的含义就是 用该回调函数的返回值 去替换当前正则匹配到的内容

使用 replace方法 去 实现 getParam 方法 比match的优势 即使有g 也能实现小分组的捕获

    function getParam(str){
        var obj = {};
        str.replace(/([^?=&]+)=([^?=&]+)/g,function(a,b,c){
            
            obj[b]=c
        })
        //箭头函数写法 str.replace(/([^?=&]+)=([^?=&]+)/g,(a,b,c)=>obj[b]=c)
        return obj;
    }

千分符

第一种方法

 var str = '1234345345';
    var s = ''
    for(var i = 0 ; i < str.length; i++){
        if(i%3==2){
            s += str[i]+','
        }else{
            s += str[i]
        }
    }

第二种方法

 var str = '1234345345';
    str = str.split('').reverse().join('');// 字符串反转
    var res = str.replace(/\d{3}/g,function(a){
        return a+','
    })
    res = res.split('').reverse().join('');

第三种方法

var str = '1234345345';
var res = str.replace(/\d{1,3}(?=(\d{3})+$)/g,function(...arg){
        return arg[0]+','
   })