求助一个数字输入的正则表达式 - V2EX
请不要在回答技术问题时复制粘贴 AI 生成的内容
zzlit

求助一个数字输入的正则表达式

  •  
  •   zzlit Jun 5, 2023 3046 views
    This topic created in 1096 days ago, the information mentioned may be changed or developed.

    需要满足

    1. 00 这种情况不出现输入的时候只展示 0
    2. 01 这种情况展示 1
    3. 0.1 可以出现 现在写了一个正则如下,可以满足前两点,匹配上就后面的替换掉前面的,但是一加上小数点情况就多起来了,怎么写都不太对,求大佬帮帮忙。
    const reg = /(?<=^0)\d+/g; 
    Supplement 1    Jun 5, 2023
    感谢大佬们的解答给我提供了很多的思路,各个正则我也都试了去理解是什么含义,确实只有多用才能熟练。我的解答也是借鉴了大佬们的回答,最终拆成了两步来走,容易理解一点,应该基本就是这样了。

    最后再次感谢大家热情解答~
    ```
    <input type="text" id="input" />


    function removeLeadingZero(num) {
    const regex = /^([+-]?)0+(?=\d)/g;
    return num.replace(regex, '$1');
    }
    function limitNumberDot(num) {
    const regex = /^\d+\.?\d{0,2}/g;
    const matchResult = num.match(regex);
    if (matchResult) return matchResult[0];
    return num;
    }
    const input = document.getElementById('input');
    input.addEventListener('input', function () {
    const v = input.value;
    input.value = limitNumberDot(removeLeadingZero(v));
    });
    ```
    31 replies    2023-06-05 18:27:54 +08:00
    littlepanic72
        1
    littlepanic72  
       Jun 5, 2023
    [-+]?\b[0-9]*\.?[0-9]+\b regexbuddy 从这个软件找出来的... 安利一个
    littlepanic72
        2
    littlepanic72  
       Jun 5, 2023
    @littlepanic72 好像不行...
    zhzy
        3
    zhzy  
       Jun 5, 2023
    其实写不明白的话, 可以考虑不用正则来做吧...
    dreasky
        4
    dreasky  
       Jun 5, 2023
    parseFloat 不就得了
    masellum
        5
    masellum  
       Jun 5, 2023
    这需求不用正则也可以,写成显式的逻辑还更好维护,何必麻烦自己一定要上正则。
    Alias4ck
        6
    Alias4ck  
       Jun 5, 2023
    xiayushengfan
        7
    xiayushengfan  
       Jun 5, 2023
    chatgpt
    Alias4ck
        8
    Alias4ck  
       Jun 5, 2023
    xiayushengfan
        9
    xiayushengfan  
       Jun 5, 2023
    ^(0|[1-9]\d*)(\.\d+)?$
    GzhiYi
        10
    GzhiYi  
       Jun 5, 2023
    有点像是强制输入数值型,比如说价格这种需求。同意楼上说的,获取输入字符后,走 if else 判断一些特殊的输入,最后再走合适的正则。
    dinghmcn
        11
    dinghmcn  
       Jun 5, 2023
    参考 #4 楼的做法,大学的时候做计算器,就解决过类似的问题;使用保存都使用浮点型显示的时候转换成字符串
    Ashore
        12
    Ashore  
       Jun 5, 2023
    /^0*(?:[1-9][0-9]*|0(?:\.[0-9]+)?)$/
    loading
        13
    loading  
       Jun 5, 2023
    如果是 el-input 的话,formatter parser 再结合 holder 应该就可以了,如果是前端,很好做。

    你是普通 gui 还是前端
    littlepanic72
        14
    littlepanic72  
       Jun 5, 2023
    @Alias4ck 这个也有点点问题....+0010086 用这样子写的时候他还是会把 00 都认为匹配.... 不加正负号的情况 这个代码就很好了....
    littlepanic72
        15
    littlepanic72  
       Jun 5, 2023
    @Alias4ck +0010086 也通不过这个测试
    Alias4ck
        16
    Alias4ck  
       Jun 5, 2023
    @littlepanic72 再改下就好了 (?![+-]?0\d)[+-]?\d*\.?\d+
    Alias4ck
        17
    Alias4ck  
       Jun 5, 2023   1
    @littlepanic72 其实不会出现你这种情况+001002 / -0023123,你发的这种数字就不太合理
    laoyutang
        18
    laoyutang  
       Jun 5, 2023 via Android
    str.replace(/^0*(?!\.)/,'')
    NoOneNoBody
        19
    NoOneNoBody  
       Jun 5, 2023
    你这是两个需求:校验和替换,各自正则不同,同时实施的话需要有 callback 功能的语言

    只考虑替换的话:
    ^([-+])?(0+)(([1-9][0-9\.]?)|0)$ --> $1$3
    如果全 0 带符号的情况,去掉符号的我还要想一下,这个还不行
    Pipecraft
        20
    Pipecraft  
       Jun 5, 2023   3
    把开头连续的 0 去掉就可以。

    ```
    function removeLeadingZero(num) {
    const regex = /^([+-]?)0+(?=\d)/
    return num.replace(regex, "$1")
    }

    console.log(removeLeadingZero("00"))
    // 0
    console.log(removeLeadingZero("000"))
    // 0
    console.log(removeLeadingZero("01"))
    // 1
    console.log(removeLeadingZero("001"))
    // 1
    console.log(removeLeadingZero("0.1"))
    // 0.1
    console.log(removeLeadingZero("+0.1"))
    // +0.1
    console.log(removeLeadingZero("-0.1"))
    // -0.1
    console.log(removeLeadingZero("00.1"))
    // 0.1
    console.log(removeLeadingZero("0012340012"))
    // 12340012
    console.log(removeLeadingZero("+0010086"))
    // +10086
    console.log(removeLeadingZero("-0010086"))
    // -10086
    console.log(removeLeadingZero("+000000"))
    // +0

    ```
    bluetree2039
        21
    bluetree2039  
       Jun 5, 2023
    chatpgt 对 正则很 精通~
    laoyutang
        22
    laoyutang  
       Jun 5, 2023
    '00'.replace(/^0(?!\.)/,'')
    '0'
    '01'.replace(/^0(?!\.)/,'')
    '1'
    '0.1'.replace(/^0(?!\.)/,'')
    '0.1'
    zzlit
        23
    zzlit  
    OP
       Jun 5, 2023
    @zhzy
    @masellum
    @GzhiYi
    @dinghmcn 感谢大佬提供另一种思路,只是这里原逻辑是用正则写的,我是进行的优化所以就顺着正则思路想了,我想想看怎么处理好
    zzlit
        24
    zzlit  
    OP
       Jun 5, 2023
    @littlepanic72
    @Alias4ck
    @xiayushengfan
    @Ashore
    @Pipecraft
    @laoyutang 感谢大佬的回答,我琢磨一下正则的规则
    zzlit
        25
    zzlit  
    OP
       Jun 5, 2023
    @loading 前端,是用 vue 写的指令绑在 input 上的,对输入作限制
    zzlit
        26
    zzlit  
    OP
       Jun 5, 2023
    @NoOneNoBody 我本来想的也是这两个部分,拆成两个正则来走规律,但是仔细一想想好像其实用一个正则也可以满足,就是没想好...
    xiaoyai0322
        27
    xiaoyai0322  
       Jun 5, 2023
    replace(/^0*/g, '').replace(/[^\d.]/g, '')
    .replace(/\.{2,}/g, '.').replace('.', '$#$')
    .replace(/\./g, '').replace('$#$', '.')
    .replace(/^\./g, '0.')
    .replace(new RegExp("^(\\-)*(\\d+)\\.(" + '\\d'.repeat(n) + ").*$"), '$1$2.$3')
    xiaoyai0322
        28
    xiaoyai0322  
       Jun 5, 2023
    replace(/^0*/g, '').replace(/[^\d.]/g, '')
    .replace(/\.{2,}/g, '.').replace('.', '$#$')
    .replace(/\./g, '').replace('$#$', '.')
    .replace(/^\./g, '0.')

    最后那个是保留几位小数 //.replace(new RegExp("^(\\-)*(\\d+)\\.(" + '\\d'.repeat(n) + ").*$"), '$1$2.$3')
    magicyao
        29
    magicyao  
       Jun 5, 2023
    ^([1-9][0-9]|0)*[\.]?([0-9]*[1-9])?$
    wuwukai007
        30
    wuwukai007  
       Jun 5, 2023
    gpt4: /^0*(0\.|[1-9])/
    nzbin
        31
    nzbin  
       Jun 5, 2023
    很久以前做过一个类似的需求。。。
    https://www.cnblogs.com/nzbin/p/6742528.html
    About     Help     Advertise     Blog     API     FAQ     Solana     2957 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 62ms UTC 11:07 PVG 19:07 LAX 04:07 JFK 07:07
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86