js 正则表达式中关于限定符的一些疑惑?

var s = '123456789'

var r1 = /(\d{3})+/
var r2 = /(\d{3})?/g

s.match(r1) // ['123456789', '789']
s.match(r2) // ['123']
s.match(r2) // ['456']
s.match(r2) // ['789']

var r3 = /(\d{3})/g

s.match(r3) // ['123'. '456'. '789']

第一问: r1 的匹配结果的第二项为什么是789?而不是123?
第二问: r3 的匹配结果为什么没用整个先匹配('123456789')?

已解决 悬赏分:50 - 解决时间 2021-11-28 07:13
反对 0举报 0 收藏 0

回答2

最佳
  • @

    第一问。我觉得是被覆盖了。或许你想问的是贪婪模式非贪婪模式
    image.png
    image.png

    第二问。/(\d{3})/g中,\d是数字,{3}代表是三个,合起来就是三个数字。
    image.png
    那么如何匹配整体?
    image.png

    支持 0 反对 0 举报
    2021-11-27 09:48
  • @
    var r1 = /(\d{3})+/g
    var r2 = /(\d{3})?/g
    
    s.match(r1) // ['123456789', '789']

    在chrome下执行只会返回 ["123456789"],所以我不知道你的结果是怎么来的image.png

    1. ?的意思是 0次或1次 如果匹配整个1-9,那就是3次 显然不符合,而0次又相当于没匹配到内容,所以默认匹配1次
    支持 0 反对 0 举报
    2021-11-27 10:55