• javascript正则表达式---正向预查


    什么是正向预查?这里有腾讯招聘的一个例子:

    如何给一串数字用千分制表示?比如9999999999变成9,999,999,999。这样一个问题你会怎么答呢?博主js正则学的不咋样,然后用操作字符串的办法做,变成字符串,先除以3,看有几对,然后再加逗号…………(省略无数个步骤)

    直到有一天我看到了这样一个回答:

     var f = '99999999999'.replace(/d{1,3}(?=(d{3})+$)/g, '$&,');
    console.log(f);

    一行代码搞定了。我当时是惊呆的0.0,但是不知道这是啥意思阿。就重新学了一遍正则,发现里面有个叫正向预查的东西,很神奇,就一起来看看这是什么鬼。

    (?=)这个东西就是正向预查。

    先给一个简单的例子:

    var con="coming soon,going gogogo"
    var reg = /[w]+(?=ing)/g;//匹配带ing的单词,但是不要ing。注意:如果ing后不加,类似于goingabc也会匹配。
     console.log(con.match(reg));

    这里匹配到["com", "go"]。先匹配单词边界,然后+匹配前面多次或者一次,然后到这个正向预查,(?=ing)表示先向后探测,看看有没有ing。如果有,则把前面的匹配出来;如果没有,则光标往后移一位,继续探测。这个过程就是正向预查:预先判断为某个值。然后匹配到的东西不包含这个元素,这里也就是ing。官方原话是该匹配不需要获取以供以后使用,是一个非捕获匹配。

    相似的还有非捕获性数组: (?: ) 

    var color = "#990000";
    /#(?:d+)/.test(color);
    alert(RegExp.$1);//""

    这里的正向预查,属于零宽断言,也是正向前瞻。

    正向前瞻用来检查接下来的出现的是不是某个特定的字符集。而负向前瞻则是检查接下来的不应该出现的特定字符串集。零宽断言是不会被捕获的。

    不过javascript不支持后瞻。

    好,回到我们的问题,为了方便观察,我们换做1234567890来匹配

    `1234567890`.match(/d{1,3}(?=(d{3})+$)/g)
    d首先贪婪匹配123,成功,进入顺序肯定环视,456,789匹配成功,控制权交到$匹配789,匹配失败,回溯

    d匹配12,成功,进入顺序肯定环视,345,678匹配成功,控制权交到$匹配678,匹配失败,回溯

    d匹配1,成功,进入顺序肯定环视,234,567,890,控制权交到$匹配890,匹配成功.


    d贪婪匹配234,成功,进入顺序肯定环视,567,890匹配成功,控制权交到$匹配890,匹配成功

    d贪婪匹配567,成功,进入顺序肯定环视,890匹配成功,控制权交到$匹配890,匹配成功

    d贪婪匹配890,成功,进入顺序肯定环视,匹配空字符串匹配失败,匹配失败。

    d匹配89,d匹配8在顺序肯定环视里都会失败,于是返回。

    文档匹配1,234,567

    还有一些资料:

  • 相关阅读:
    全卷积神经网络FCN
    面试题 —— 面向对象
    【一题多解】平方根的计算及完全平方数的判断
    【一题多解】Python 字符串逆序
    JVM 自带性能监测调优工具 (jstack、jstat)及 JVM GC 调优
    n 中选 m —— 随机采样的艺术
    位图(bitmap)—— C语言实现
    C++ STL 数据结构与算法 —— 排序
    斐波那契 —— 矩阵形式推导
    常用文本编辑器 editor 的常用插件 —— CopyEdit
  • 原文地址:https://www.cnblogs.com/dh-dh/p/5261044.html
Copyright © 2020-2023  润新知