cover 正则表达式之-g模式的简单了解,为什么会突然想起这个问题呢?还要缘由从US项目说起,因为需求其中一列要显示成这样 list,像图中显示那样,每个部门的分数如果有小数位最后保留俩位小数,如果是整数就直接显示整数。但是后端返回的数据是这样的

    var departments = [{
      department: "办公室",
      score: 38.714749999999995
    }, {
        department: "应维",
        score: 39.492000000000004
    }, {
        department: "开发",
        score: 39
    }, {
        department: "设计",
        score: 39
    }, {
        department: "运营",
        score: 39.195
    }]

所以我就想写一条正则语句来对这些数据进行过滤,正则表达式如下:

  var re = /\d+\.\d+/g

这条正则想干的就是匹配那些具有小数点的数值。结果如下: result 但是问题的重点不在这里,我就用上面的正则语句去匹配了departments里面的每项的score。代码如下:

  var re = /\d+\.\d+/g
  departments.forEach(value => {
    if (re.test(value.score)) {
      console.log(value.score)
    }
  })

结果如下图,只输出了38.71474999999999539.195俩个数,为什么输出没有第二项里面的score,按理说,这三项是都能被正则表达式所匹配的,但是事实上就是没有匹配到,一开始我还以为是js浮点数的bug,去查资料,发现并没有这方面的问题。这个时候老司机(黄康德)出现了,老司机就是老司机,老司机说去看看是不是正则的bug,这时候才想起去找正则表达式的锅,到了后面慢慢发现是-g模式的问题 g_result 这时候咱们看一下-g模式到底是怎么运行的,g表示global,表示全局匹配,就是匹配所有符合规则的字串。普通模式是匹配到第一个符合的就停止匹配,全局模式是匹配到第一个符合的字串之后,继续匹配一直匹配到最后一个字符为止。那么他是怎么进行的呢?看一下下面的代码。

  var str = 'macmscm'
  var re = /m/g
  for (var i = 0; i < 6; i++) {
    console.log(re.test(str))
    console.log(re.lastIndex)
  }

上面的lastIndex是上次匹配的字串的index(位置),下次匹配从这里开始进行匹配。

所以我们就开始知道了全局模式的匹配是怎么回事,理一下思路,一开始re.lastIndex = 0,也就是从待匹配的字符串的第一个字符开始匹配符合规则的字串,匹配到之后就把lastIndex更改到匹配到的字串的最后一个字符的位置,准备进行下一次的匹配,一直匹配到最后一个符合匹配的字串,这时再进行下一次匹配,已经没有符合的字串了,这时lastIndex又回到了0。这个时候相信大家应该和我一样对全局模式有了一个简单的了解了。

扫描二维码,分享此文章

sjffly