美文网首页
正则总结

正则总结

作者: 果汁密码 | 来源:发表于2018-05-20 10:32 被阅读13次

    正则

    • 元字符
      • 特殊含义的元字符
        \:转义符
        ^:开头
        $:结尾
        \n:匹配一个换行符
        .:除了\n以外的任意字符
        x|y :x或y中的一个
        [xyz]:xyz中的一个
        [^xyz]:除了三个以外的任何一个
        [a-z]:a-z之间的任何一个字符
        [^a-z]:除了a-z之间的任何一个字符
        \d:一个0-9之间的数字 \D:除了0-9之间的数字
        \b:匹配一个边界符
        \w:数字、字母、下划线中的任意一个
        \s:匹配一个空白字符 空格、一个制表符、换页符
        ():分组 把一个大正则分成几个小正则
      • 代表次数的量词元字符
        *:出现零到多次
        +:出现一到多次
        ?:出现零次或者一次
        {n}:出现n次
        {n,}:出现n到多次
        {n,m}:出现n到m次
    • 修饰符
      • g 全局匹配
      • i 忽略大小写
      • m 换行操作 多行操作

    正则:用来操作字符串(匹配和捕获)的规则

    • 匹配: 看字符串是否符合我们制定的规则 reg.test()
    • 捕获: 把符合我们规则的字符串取出来 reg.exec()
        let reg = /\d/;
        console.log(reg.test('zsw123')); // ->true
        console.log(reg.test('zsw')); // ->false
        let reg2 = /\d+/g;
        console.log(reg2.exec('zsw123zsw456'));// ["123", index: 3, input: 
       "zsw123zsw456"]
        console.log(reg2.exec('zsw123zsw456'));// ["456", index: 9, input: 
       "zsw123zsw456"]
    

    捕获正则有两大特点:

    • 懒惰性 解决:加全局g
    • 贪婪性 解决:量词+?

    reg.exec() 用来捕获符合我们规则的字符串,每次只能捕获到一个,捕获到的这个是数组,数组总共包含三项:

    • 符合规则的字符串内容
    • 该内容开始的索引
    • input:原始字符串
      如果exec找不到符合规则的内容,返回值是null
      为何exec如果不加全局g的时候,每次都捕获到第一项?
      因为reg.lastIndex永远都是从0开始的
     // 懒惰型
        let reg = /\d+/;
        console.log(reg.exec('zsw123zsw456'));// ["123", index: 3, input: "zsw123zsw456"]
        console.log(reg.exec('zsw123zsw456'));// ["123", index: 3, input: "zsw123zsw456"]
    // 加全局g
     let reg = /\d+/g;
        console.log(reg.exec('zsw123zsw456'));// ["123", index: 3, input: "zsw123zsw456"]
        console.log(reg.exec('zsw123zsw456'));// ["456", index: 9, input: "zsw123zsw456"]
    // 贪婪性  量词后面加?
        let reg = /\d+?/g;
        console.log(reg.exec('zsw123zsw456'));// ["1", index: 3, input: "zsw123zsw456"]
        console.log(reg.exec('zsw123zsw456'));//["2", index: 4, input: "zsw123zsw456"]
    

    []的总结

    • []里面的特殊字符串没有没有特殊含义,代表的都是他本身的意思
    • []中不会出现两位数

    ?的总结

    • 量词 0或1
    • 解决正则的贪婪性的问题:量词+?
    • (?:)只匹配不捕获
        let reg=/(\d{2})(\d{2})/g;
        console.log(reg.exec('1234'));// ["1234", "12", "34", index: 0, input: "1234"]
        let reg2=/(\d{2})(?:\d{2})/g;  // ?:只匹配不捕获
        console.log(reg2.exec('1234'));// ["1234", "12", index: 0, input: "1234"]
    

    ():分组

    • 1:改变x|y的优先级 18或者19 /^(18|19)$/
    • 2.分组引用:\2代表和第一个分组出现一模一样的内容,\1和第一个分组出现一模一样的内容
    let reg = /^(\w)\1(\w)\2$/
    console.log(reg.test("zzff")) //->true
    console.log(reg.test("z0f_")) // -> false
    
    • 3.分组捕获
      在分组中(?:)的作用是只匹配不捕获

    match

    match实现的核心原理就是利用exec分次捕获得到的

    match和exec的区别

    • match一次性可以捕获到的所有符合正则规则的内容,放在一个新的数组返回
      exec每次只能捕获到一个符合规则的内容,并且以数组的形式返回,我们要的内容一般是数组的第一项
    • match不能进行小分组的捕获
      exec可以进行小分组的捕获,他的小分组从索引开始(从第二项开始)如果没有分组,exec数组中有3项

    exec

    • 每次只能找到一项 数组
      • 这个数组在没有小分组的情况,拿到的是这个数组的只有3项:
        1.我们匹配到的内容;2.内容开始的索引;3.原始字符串
      • 这个数组如果有小分组
        1.我们匹配到的内容(符合大正则的内容);
        2.从第二项开始,一直到ary.length-2之前都是小分组捕获出来的内容;
        3.倒数第二项--索引
        4.最后一项:原始字符串
        let reg=/(\d{2})(\d{2})/g;
        console.log(reg.exec('1234'));// ["1234", "12", "34", index: 0, input: "1234"]
    

    exec和match区别

    • exec存在小分组,但match没有
    • match一次性可以匹配到所有的内容,并且都放在一个数组中
      exec只能一次次的捕获
      exec和replace运用思想一模一样
        let reg = /(\d{2})(\d{2})/g;
        let str = 'abcd1234sad4567';
        console.log(reg.exec(str));// ["1234", "12", "34", index: 4, input: "abcd1234sad4567"]
        console.log(reg.exec(str));// ["4567", "45", "67", index: 11, input: "abcd1234sad4567"]
        console.log(str.match(reg));// ["1234", "4567"]
    

    捕获

    • exec
    • match
    • replace

    replace

    • 如果没有正则,replace只能一次次的去匹配和替换
    • 如果有正则,就可以批量替换
      replace的第二个参数,可以是个函数,函数的执行次数跟匹配成功的次数有关或
        let reg = /(\d{2})(\d{2})/g;
        let str = 'abcd1234sad1234';
        console.log(str.replace('1234','5678')); //abcd5678sad1234
        console.log(str.replace('1234','5678')); //abcd5678sad1234
        console.log(str.replace(reg,'5678'));//abcd5678sad5678
    

    应用:
    1.有效数字 正数、负数、零、小数
    "."可以出现也可以不出现,但是一旦出现,后面必须跟一位或多位数字
    最开始可以有+/ -也可以没有
    整数部分,一位数可以是0-9之间的一个,多位数不能以0开头
    /^[+-]?(\d|([1-9]\d+))(\.\d+)?$/
    2.年龄介于18-65 (18-19 20-59 60-65)
    /^(1[8-9]|[2-5]\d|6[0-5])$/
    3.中国标准真实姓名 2-4位汉字
    /^[\u4e00-\u9fa5]{2,4}$/
    4.数字转大写

        let str = '20180520';
        let ary = ['零','壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
        str = str.replace(/\d/g, function () {
            return ary[arguments[0]]
        });
        console.log(str); //贰零壹捌零伍贰零
    

    5.解析url

    let str = 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=obj&oq=js&rsv_pq=9560a0460000df45&rsv_t=0cf=cn&rsv_enter=1&rsv_sug3=3&rsv_sug1=3&rsv_sug7=100&rsv_sug2=0&inputT=753&rsv_sug4=752';
        let reg = /([^?=&]+)=([^?=&]+)/g;
        let obj = {};
        str.replace(reg, function () {
            obj[arguments[1]] = arguments[2]
        });
        console.log(obj);
    
    url.png
    6.get-element-by-id转成getElementById
    var str = 'get-element-by-id'
    str.replace(/(?:-)([a-z])/g,function(){
              return arguments[1].toUpperCase()
    })
    // -> "getElementById"
    

    7.手机号中间4位替换成*

    var phone='15000001234'
    var res=phone.replace(/(\d{3})(\d{4})(\d{4})/, "$1****$3")
    // "150****1234"
    

    8.姓名显示最后一字其他替换成星号

    var name='张老三'
    var res=name.replace(/.(?=.)/g,'*')
    // "**三"
    // (?=)可以理解为不占匹配位,不占匹配位就不会替换
    

    相关文章

      网友评论

          本文标题:正则总结

          本文链接:https://www.haomeiwen.com/subject/pklkextx.html