V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
weixiangzhe
V2EX  ›  正则表达式

关于正则数字添加千分号 /\B((?=(?:\d{3}))+$)/g 不太理解

  •  
  •   weixiangzhe · 2022-01-29 10:26:10 +08:00 · 1158 次点击
    这是一个创建于 789 天前的主题,其中的信息可能已经有所发展或是发生改变。

    img

    (?=(?:\d{3}) 可以匹配到 "333" 前面的空字串 ""

    (?=(?:\d{3})+ 一到多个 但匹配里的 $ 号,或者有些人写的 (?!\b) 是啥意思呢

    '8123456789'.replace(/\B(?=(?:\d{3})+$)/g,',') // 8,123,456,789
    
    "8123456789".replace(/\B(?=(?:\d{3})+(?!\d))/g,",") // 8,123,456,789
    

    为什么不能写成

    '8123456789'.replace(/\B(?=(?:\d{3}))+$/g,',') // '8123456789'
    
    5 条回复    2022-01-29 12:58:14 +08:00
    weixiangzhe
        1
    weixiangzhe  
    OP
       2022-01-29 10:26:35 +08:00
    [img][/img]
    weixiangzhe
        2
    weixiangzhe  
    OP
       2022-01-29 10:27:28 +08:00
    [img][/img]
    freedomSky
        3
    freedomSky  
       2022-01-29 11:27:55 +08:00
    '8123456789'.replace(/\B(?=(?:\d{3})+$)/g,',') // 8,123,456,789 #当前位置(非边界)后到结尾有 3N 个字母,则插入分隔符

    "8123456789".replace(/\B(?=(?:\d{3})+(?!\d))/g,",") // 8,123,456,789 #当前位置(非边界)后面有 3N 个数字+非数字,则插入分隔符,比如 8123456789x

    '8123456789'.replace(/\B(?=(?:\d{3}))+$/g,',') # 这里+施加在 look ahead 上是无效的,必须在 look ahead 的内部,这里相当于没有加,$也放在 look ahead 外,我理解相当于被替换的东西不连续了(中间是 look ahead ),应该是不允许的
    freedomSky
        4
    freedomSky  
       2022-01-29 11:29:24 +08:00
    @freedomSky 第一行打错了,3N 个字母-》 3N 个数字
    imn1
        5
    imn1  
       2022-01-29 12:58:14 +08:00
    题外,这个只能用在整数,还不够通用,$改成(\.|$)能用在浮点数

    (?!\d)估计目的也是用在兼容浮点数,只是不够明确,当然如果输入无误(排除字母乱入的情况),也是足够的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3158 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 12:22 · PVG 20:22 · LAX 05:22 · JFK 08:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.