第二十二章 正则

110 阅读3分钟

一、正则介绍

  • 正则:一种处理字符串的规则
  • 处理:匹配 捕获
    匹配:有一段正则和字符串,匹配的意思是为了看这个字符串是否符合这个正则定义的规则。
    捕获:有一段正则和字符串,捕获的意思是把这个字符串中符合这个规则的部分捕获到
  • 写法:/元字符/
var reg = /1/; // 字面量  /元字符/     定义了一个规则:字符串中得有1
        var reg2 = new RegExp('1'); //构造函数:
        reg.test("afaffaawa"); //匹配用到的函数test  
        var reg3 = /\d/;
  • 元字符
    特殊元字符:
    • \ 作用:转义
    • \d 作用:数字
    • \D 作用:除数字以为的其他字符
    • \w 作用:数字、字母或下划线
    • \W 作用:数字、字母或下划线以外的其它字符
    • ^ 作用:以字符后边的一位开头,若写就得写在正则的最前边
    • $ 作用:以字符前边的一位结尾,若写就得写在正则的最后边 中括号:
    • [xyz] 作用:中括号中元素之间或的关系,返回值只有一位(表示只要包含中括号中任意一位元素即可)
    • [^ab] 作用:代表除了ab以外的字符(^在这里表示取反的意思)
    • [a-z] 作用:代表一位小写字母即可
    • [A-Z] 作用:代表一位大写字母即可
    • [a-zA-Z] 作用:代表大小写字母任意一位即可
    • a|b 作用:a或者b中的一位
    • . 作用:表示除了换行以外的其他字符(中括号中的点代表点本身)
    • () 作用:提升优先级 分组(捕获时候的概念) 小问题:
      /^11|22/代表11开头或者12结尾/(1122)/ 代表11开头或者12结尾 /^(11|22)/ 代表11或者12

修饰符:

  • g global 全局匹配,最多用于捕获,匹配时很少用
  • i ignoreCase 忽略大小写
  • m multiline 多行匹配 量词元字符: (量:数量)用在要修饰的字符的后边
  • ? /\d?/ 作用:代表前边的字符出现0或者1次
    • 作用:表示前边的字符出现1到多次
    • 作用:表示前边的字符出现0到多次
  • {n} 作用:表示前边的字符出现n次
  • {n,} 作用:表示前边的字符出现n到多次
  • {n,m} 作用:表示前边的字符出现n到m次
var str = "你好"珠峰"" //字符串中的转义,就是把字符串中有特殊含义的字符 转成字符本身(不代表任何含义)
        box.innerHTML = `\d在正则中表示数字的意思`
        box.innerHTML = `\\d`
        var reg4 = /\d/ //定义了一个规则:字符串中得有数字

        var reg5 = /^1/     //规则就是 字符串必须得是1开头的
        var reg6 = /1$/     //规则就是 字符串必须得是1结尾的
        var reg7 = /21$/     //规则就是 字符串必须得是1结尾的 && ‘这个’1前边必须是2
        var reg8 = /^21$/     //规则就是 字符串必须得是2开头1结尾 && 这个1前边必须是这个2
        var reg9 = /^1$/     //规则就是 字符串必须得是这个1结尾的&& 必须是这个1开头
        var reg10 = / 2 1$/     //规则就是 字符串必须得是这个1结尾的 && 这个1前边必须是空格 这个空格前边必须是2 这个2前边必须是  
        var reg11 = / 2 ?1$/     //规则就是 字符串必须得是这个1结尾的 && 这个1前边空格出现一次或者0次 这个空格前边必须是2 这个2前边必须是 空格 

1、匹配

  • 代码:reg.test(字符串)
  • 一般考察:手机号、身份证号、邮箱、强弱密码

【练习】

let reg = /^1[3-9]\d{9}$/;
let reg1 = /^(156|189|182|131|132)\d{8}$/;
btn.onclick = (function(){
            if(reg1.test(inp.value)){       //inp.value 获取运算值
                alert('点击获取验证码');
            }else{
                alert('请输入正确的手机号');
            }
});
let reg2 = /^[1-9]\d{4,10}@qq.com$/;
btn1.onclick = (function(){
            if(reg2.test(inp2.value)){       //inp.value 获取运算值
                alert('点击获取验证码');
            }else{
                alert('请输入正确的邮箱号');
            }
});
        let reg3 = /^\d{17}(\d|X)$/;
        let reg4 = /^(1[8-9])|([2-5]\d)|(6[0-5])$/;
        btn2.onclick = (function(){
            if(reg3.test(inp3.value)){       //inp.value 获取运算值
                alert('点击获取验证码');
            }else{
                alert('请输入正确的身份证号');
            }
        });
        btn3.onclick = (function(){
            if(reg4.test(inp4.value)){       //inp.value 获取运算值
                alert('点击获取年龄');
            }else{
                alert('请输入正确的年龄');
            }
        });
//思路:
        //+-可有可无 有的话一定是在前边
        //小数部分可有可无,有的话一定在后边
        //单个整数可以是0,多位数不能是0开头
        //多少位不限制
        let reg5 = /^[+-]?(\d|[1-9]\d+)(.\d+)?$/;
        btn4.onclick = (function(){
            if(reg5.test(inp5.value)){       //inp.value 获取运算值
                alert('点击获取有效数字');
            }else{
                alert('请输入正确的有效数字');
            }
        });
        //密码只能是由字母 数字 _ . + - @ $ 组成的8到15位字符
        let reg6 = /^[\w.+-@$]{8-15}$/;//弱校验


        //密码必须包含大小写、数字、字母、(_.-+@$)组成的8-15位
        let reg7 = /^(?=.*[A-Z]).{8,15}$/;   //强校验
        //正向预查

2、捕获

特性:

  • 贪婪性:一次性获取,会尽可能多的去获取内容。
    解决方法:就在量词后边加一个?
  • 懒惰性:只取连续性的一段,不会继续往后取。
    解决方法:采用修饰符g

注意: 使用g全局捕获的时候会循环着返回捕获值的原因是:全局中的reg有个lastIndex属性,代表执行时开始位置(索引) test/exec通用

 //捕获
    var str = '珠峰2009珠峰2022';
    var reg = /\d+/g
    RegExp.prototype.execAll = function (str) {
        if (!this.global) { //防止没加g陷入死循环中
            throw new Error('没加G')
        }
        this.lastIndex = 0; //防止这个正则的lastIndex不是0而导致获取到的内容不对
        let ary = [];
        let res = this.exec(str);
        while (res) {
            ary.push(res[0])
            res = this.exec(str)
        }
        return ary
    }
    console.log(reg.execAll(str));



    let reg1 = /(feng)(\d+)/
    let reg2 = /feng\d+/
    let str1 = 'zhufeng1002珠峰2022'
    console.log(reg1.exec(str1))
    console.log(reg2.exec(str1))