• 正则表达式中圆括号的用法--也叫后向引用


    所谓后向引用:一个正则表达式使用了圆括号()导致相关匹配将存储到一个临时缓冲区中,可以使用‘ ‘来访问其中的缓冲区,其中n为一个标识特定缓冲区的一位或两位十进制数,表达式中有过对()缓冲区将会有多个结果
    当然可以使用非捕获元字符 ?: , ?=  , ?! 来忽略对相关匹配的保存

    问题: 如果不忽略这种缓冲区保存会有什么影响,什么时候要忽略保存?

    答:正则表达式() 的用法,叫后向引用,也叫反向引用,就是将正则表达式的匹配结果临时存储起来,供以后调用
     
     例1:

    var num = "1234 5678";
    var newNum = num.match(/(d{4}) (d{4})/);
    console.log(RegExp.$2,RegExp.$1); 5678 1234
    

     
     例2:

    var num = "1234 5678";
    var newNum = num.match(/(?:d{4}) (d{4})/);
    console.log(RegExp.$2,RegExp.$1); 5678 空
    


    例3: 也可以在表达式中直接使用’ ‘ 取缓存的结果

    var num = "dotor dogdog";
    var newNum = /(?:dot)or (dog)1$/.test(num);
    console.log(newNum); //true
    console.log(RegExp.$1); //dog
    

     
    可以看出是将缓存结果是从正则的左到右将匹配()的结果,从$1开始到$99存起

    也就是说如果后面我们不用到这个缓存结果,我们可以使用非捕获模式(?: );这在使用“或”的时候
    是很有用的。例如:'industr(?:y|ies)' ,就是一个比’industry|industries‘ 更简略的表达式

    --------------------------------------------------------------------------------华丽丽的分割线------------------------------------------------------------------------------------

    了解完捕获元之后,我们再来了解了解这两个正反预查:

    ?= 正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串
    ?! 负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串

    上面的概念可能很难看懂,我喜欢用例子来令自己心悦诚服:


    ?= 正向预查,也叫正向前瞻 。例如:/Windows(?=95|98|NT|2000)/ 能匹配“Windows 2000中的Windows” 但不能匹配“Windows 3.1” 中的windows 。
    ?! 反向预查,取结果刚好相反。能匹配“Windows 3.1中的Windows” 但不能匹配“Windows 3.1”的Windows。

    正向预查与反向预查不消耗字符。一开始我不懂这个是啥意思,直到我在网上看到一位大牛的例子,瞬间醍醐灌顶………………

    var text = "abc";
    var reg = /a(?=b)bc/;
    var reg2 = /a(b)bc/;
    
    var result = reg.test(text);
    var result2 = reg2.test(text);
    
    console.log(result); //true
    console.log(result2); //false
    


    可以看出正向匹配没有消耗掉字符b,后面还可以匹配上b 。

    最后,留一个解析地址url的正则,如果这个都摸懂了,估计,你就真的懂后向引用,正反向预查了

    
    
    var url = "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu#top";
    
    var parse = url.match(/^(?:([a-z]+)://)?([w-]+(?:.[w-]+)+)?(?::(d+))?([w-/]+)?(?:?((?:w+=[^#&=/]*)?(?:&w+=[^#&=/]*)*))?(?:#([w-]+))?$/i);
    
    console.log(parse);
    
    
    
    

    后记--为什么我写的博客这么丑,难为各位了,小博有空一定优化一下哈



  • 相关阅读:
    文件语音识别Google语音识别学习札记 Windows PC机上测试语音识别Strut2教程java教程
    进程方法Android面试题(二)Strut2教程java教程
    工程选择LibGdx开发环境搭建Strut2教程java教程
    检查点重做检查点队列简单总结Strut2教程java教程
    ORACLE连接数据库(备忘)
    字符扫描剑指Offer读书笔记之第二章2字符替换Strut2教程java教程
    文件函数Django1.5实战第一步之搭建环境,创建工程,运行开发服务器Strut2教程java教程
    算法长度K最短路问题(单源点最短路径+A*算法)Strut2教程java教程
    单位真实世界LibGdxBox2d单位换算Strut2教程java教程
    配置执行【Oracle】无法对所有 EM 相关帐户解锁Strut2教程java教程
  • 原文地址:https://www.cnblogs.com/djh-create/p/5964986.html
Copyright © 2020-2023  润新知