V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
palmers
V2EX  ›  程序员

正则表达式求助,校验合法小数或整数, 需要排除情况如下

  •  
  •   palmers · 2019-05-07 23:36:28 +08:00 · 3237 次点击
    这是一个创建于 2034 天前的主题,其中的信息可能已经有所发展或是发生改变。

    首先数字匹配是一定的 整数或小数,但是网上找到的匹配正则大都不能过滤如下情况:

    • 01.11, 02.12 等
    • 02 ,087 等

    允许是 0.0 或 0

    谢谢大家了~

    23 条回复    2019-05-08 20:05:47 +08:00
    AX5N
        1
    AX5N  
       2019-05-08 00:04:04 +08:00
    你是不允许首字母是 0 吗?那写成两段不就得了,0 开头和非 0 开头的,用「或」连接
    palmers
        2
    palmers  
    OP
       2019-05-08 00:07:05 +08:00
    @AX5N 我正则一塌糊涂 能麻烦您把正则写出来吗?
    weixiangzhe
        3
    weixiangzhe  
       2019-05-08 00:15:47 +08:00
    /^([1-9]\d*|0)(\.\d+)?$/
    cydysm
        5
    cydysm  
       2019-05-08 02:37:53 +08:00 via iPhone
    @weixiangzhe 这个网站下面的流程图棒!
    lastpass
        6
    lastpass  
       2019-05-08 08:45:15 +08:00 via Android   ❤️ 1
    →_→你先.number 不就好?
    lastpass
        7
    lastpass  
       2019-05-08 08:48:49 +08:00 via Android   ❤️ 1
    在校验之前先转换为标准的数字类型。
    不要拿个字符串就来正则匹配。
    →_→你说的这些问题就不根本不存在。
    palmers
        8
    palmers  
    OP
       2019-05-08 09:47:19 +08:00
    @weixiangzhe 非常感谢! 您给的地址挺好用的 很清晰 对我很有帮助 我需要匹配整数位和小数位最多 n 位,n 是动态可调整的 所以我改了一下,不知道对不对, 麻烦您帮我看一下:
    /^(?:([1-9]\d{0,1}|0))(?:\.\d{0,2})?$/
    上面正则可以匹配:
    0. 整数 0
    1. 整数 20, 20.0
    2. 小数 整数部分和小数部分分别最多 2 位 20.20 , 0.01, 12.22

    麻烦您了
    palmers
        9
    palmers  
    OP
       2019-05-08 09:51:36 +08:00
    @lastpass 我需求是这样的,input 中输入, 如果不是空字符, 就会进行校验,在 onChange 中,不允许用户输入不符合规则的字符 比如非数字(.除外) , 0 后面紧跟着是数字等
    imdong
        10
    imdong  
       2019-05-08 10:06:05 +08:00
    https://regex101.com/r/9mvoSw/1
    楼主看下这个正则表达式符合不


    ^(?!0[0-9])[0-9]+(\.(?>[0-9])[0-9]{0,5})?$
    lastpass
        11
    lastpass  
       2019-05-08 11:08:09 +08:00 via Android
    回复 @palmers 是哒,你加个 .number 修饰符就好呀。用户在输入的非数字字符会直接忽略的。对应这些校验。还是推荐 async-validator,像这种数字校验,直接
    { required: true, message: '不能为空'},
    { type: 'number', message: '必须为数字值'}
    就好。
    palmers
        12
    palmers  
    OP
       2019-05-08 11:13:20 +08:00
    @imdong 可是 js 不支持 ?>
    palmers
        13
    palmers  
    OP
       2019-05-08 11:20:35 +08:00
    @lastpass 我刚查了一下 您说的这个是 vue 的 **.number 啊? 我没有使用 vue 是 react 也是第一次使用 react 所以也不清楚 rect 有没有这个修饰符, 目前我没有知道对应资料 显示 react 有在 jsx 上支持**.number 修饰符
    weixiangzhe
        14
    weixiangzhe  
       2019-05-08 11:22:56 +08:00
    jinhan13789991
        15
    jinhan13789991  
       2019-05-08 11:32:22 +08:00
    你应该给出待匹配的文本,然后我们才好针对做处理啊~
    lastpass
        16
    lastpass  
       2019-05-08 11:48:13 +08:00 via Android
    @palmers 一样哒,.number 就是 parseInt/Float(value)呀。如果没有,自己就多写一行代码啦( • ̀ω•́ )✧
    palmers
        17
    palmers  
    OP
       2019-05-08 12:23:06 +08:00
    @weixiangzhe 好的 非常感谢!
    cpdyj0
        18
    cpdyj0  
       2019-05-08 12:27:23 +08:00
    推荐下这个工具 https://regex101.com
    还可以 debug,优化
    palmers
        19
    palmers  
    OP
       2019-05-08 12:41:05 +08:00
    @cpdyj0 上面的 ver @imdong 给的就是这个工具 挺好用的 谢谢~
    imdong
        20
    imdong  
       2019-05-08 14:24:20 +08:00
    @palmers 试一下我发的 Version 3 经过测试 是可以 js 跑的了.

    ^(?:0|[1-9][0-9]*)(?:\.[0-9]{1,5})?$
    SakuraKuma
        21
    SakuraKuma  
       2019-05-08 14:34:36 +08:00
    为啥, 要用正则?
    input[type=number][step=0.01]
    palmers
        22
    palmers  
    OP
       2019-05-08 20:05:01 +08:00
    @imdong 嗯嗯 这个是可以的
    palmers
        23
    palmers  
    OP
       2019-05-08 20:05:47 +08:00
    @SakuraKuma 您说的这个我不懂, 我不是的前端开发 看不明白您这个
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2594 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 06:29 · PVG 14:29 · LAX 22:29 · JFK 01:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.