正则表达式所到的正反向匹配预查

正则表达式基础教程

正则表达式学习中,一般有两个普遍的问题

第一个,贪婪问题:

      

            var str="kpidfdffhp";
            var tmp=/pi/;  //不从头开始,只是找字串
            //alert(tmp.test(str));
            //alert(str.match(tmp));

            var ts="sad<hkkk1>wwwww<h1ppp/>ppp>";
            var pp=/<.*>/;   // * 贪婪 尽可能匹配更多的字符
            alert(ts.match(pp));   //  . 匹配除/n之外的任意字符
            
            pp=/<.*?>/; //非贪婪 最小匹配
            alert(ts.match(pp));

            //对子匹配的引用 \x x表示对之前的第x个子匹配已匹配的字符串的再次复制引用
            var hp="ppp is IS pp sod of of of sdsp";
            var op=/\b([a-z]+) \1\b/ig;
            alert(hp.match(op));

  贪婪问题可以理解为 取{0,1,2,3,4,5}中能取到的最大值,如上所示,sad<h1>wwwww<h1/>ppp>   其中>存在三个,那么按照 /<.*>/ 会取到能取到的最大位置处,即最后一个>,那么此时 * 代表了{0,1,}中能取到的最大值 16,但是若按照 /<.*?>/ 会取第一个,那么 *代表了能取到的最小值,即 2 ,就是非贪婪.

第二个,正反向问题:

   

        var s4="window2020-sdsdp023",s5="window3.1";
        var pt=/window(?=2018|2019|2020)2020/;  //?= 正向 肯定 预查 ,预查匹配后面的字符成功后,实际上既不匹配也不获取,只是检测
        document.write("<br/>"+s4.match(pt)+"  "+s5.match(pt));

        pt=/window(?!2018|2019|2020)3.1/; //?= 正向 否定 预查 ,预查匹配 非 后面的字符成功后,实际上既不匹配也不获取,只是检测
        document.write("<br/>"+s4.match(pt)+"  "+s5.match(pt));

        s4="2019window",s5="window3.1";
        pt=/2019(?<=2018|2019|2020)window/;  //?= 反向 肯定 预查 ,预查匹配后面的字符成功后,实际上既不匹配也不获取,只是检测
        document.write("<br/>"+s4.match(pt)+"  "+s5.match(pt));

      字符串为s="abcdefgh"; 

     patt="..(?=cde)..."       这是正向肯定预查, 参考下图

正向

可以理解为 后面三个  ...  真正开始匹配的起始位置为子匹配最左面字符,前面的两个 .. 的结束位置必须在 最左面字符的前面。

    patt1="...(?<=cde).."   这是反向肯定预查,参考下图

反向

可以理解为 后面两个  ..  真正开始匹配的起始位置为子匹配最右面字符的右面,前面的三个 ... 的结束位置必须是最左面字符。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值