V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
jalena

让个正则给搞疯了!!

  •  
  •   jalena · Dec 5, 2017 · 7682 views
    This topic created in 3070 days ago, the information mentioned may be changed or developed.

    好久没写这些东西!!

    搞了一早上,就是没弄对!!

    大神帮我看看呐。。

    需求: 匹配 0.5、1、1.5 这样的数据(不能为负数)

    var reg = new RegExp('^(^[0-])|(\\d+(\\.[05])?$)','g');
    var str = '1';
    var str1 = '1.5';
    var str2 = '0.5';
    var str3 = '0';
    var str4 = '0.3';
    var str5 = '-1';
    var str6 = '-1.5';
    var str7 = '2';
    var str8 = '2.5';
    console.log(str + ">>>>>>>>>>>>" + reg.test(str));
    console.log(str1 + ">>>>>>>>>>>>" + reg.test(str1));
    console.log(str2 + ">>>>>>>>>>>>" + reg.test(str2));
    console.log(str3 + ">>>>>>>>>>>>" + reg.test(str3));
    console.log(str4 + ">>>>>>>>>>>>" + reg.test(str4));
    console.log(str5 + ">>>>>>>>>>>>" + reg.test(str5));
    console.log(str6 + ">>>>>>>>>>>>" + reg.test(str6));
    console.log(str7 + ">>>>>>>>>>>>" + reg.test(str7));
    console.log(str8 + ">>>>>>>>>>>>" + reg.test(str8));
    
    51 replies    2017-12-06 17:09:27 +08:00
    abclearner
        1
    abclearner  
       Dec 5, 2017
    ^\d.?\d?
    bramblex
        2
    bramblex  
       Dec 5, 2017   ❤️ 2
    parseInt(str) > 0 && parseInt(str).toString() === str

    要什么正则
    bramblex
        3
    bramblex  
       Dec 5, 2017
    换成 parseFloat
    zpf124
        4
    zpf124  
       Dec 5, 2017   ❤️ 22
    “你有一个问题需要解决,你选择了采用正则,现在你有两个问题了。”
    zpf124
        5
    zpf124  
       Dec 5, 2017
    if(!isNaN(str)){
    var val = parseInt(str);
    return val % 0.5 ==0;
    }
    bramblex
        6
    bramblex  
       Dec 5, 2017
    硬要用正则,我这里倒是有一段用分词的,就是复杂点。
    https://github.com/bramblex/Smooth/blob/master/src/Smooth.jison#L32-L47
    bramblex
        7
    bramblex  
       Dec 5, 2017
    @zpf124 问题是有时候复杂分词,不用正则几乎没有其他手段处理。ㄟ( ▔, ▔ )ㄏ
    zgx030030
        8
    zgx030030  
       Dec 5, 2017
    new RegExp('^(?<!-)\\d+(\\.[05])?$')
    SakuraKuma
        9
    SakuraKuma  
       Dec 5, 2017
    /^\d+(\.5)?$/

    要什么正则+1。
    bzw875
        10
    bzw875  
       Dec 5, 2017
    var reg = /^(\d+|\d?\.\d+)$/
    干嘛要加 g 多行匹配啊,有^$还加 g 矛盾了
    jalena
        11
    jalena  
    OP
       Dec 5, 2017
    @zpf124 我最开始也想用模运算,,但就是想把它用正则写出来!!
    jalena
        12
    jalena  
    OP
       Dec 5, 2017
    @bzw875 g 是全局,m 才是多行
    jalena
        13
    jalena  
    OP
       Dec 5, 2017
    @SakuraKuma 你这个匹配不了 1.5,2.5,1.0
    b11
        14
    b11  
       Dec 5, 2017   ❤️ 2
    试试 /^\d+(\.[05])?$/
    SakuraKuma
        15
    SakuraKuma  
       Dec 5, 2017
    @jalena #13 1.0 是不行,1.5/2.5 应该是没问题的,自己改改就好。
    MeteorCat
        16
    MeteorCat  
       Dec 5, 2017 via Android
    用 paserXXX 系列+1
    b821025551b
        17
    b821025551b  
       Dec 5, 2017
    ^\d+(.?(\d+))?$
    scriptB0y
        18
    scriptB0y  
       Dec 5, 2017
    这个问题不应该用正则解决吧,parsexxx 不是帮你做好了吗
    jalena
        19
    jalena  
    OP
       Dec 5, 2017
    @scriptB0y 我知道直接模运算确实好做,主要是好久没整正则,就想用正则弄出来
    jalena
        20
    jalena  
    OP
       Dec 5, 2017
    @b821025551b 你这个不得行的,会匹配出 1.2,2.3 这样的!
    songz
        21
    songz  
       Dec 5, 2017 via Android
    /([12][.]5)|1/g
    songz
        23
    songz  
       Dec 5, 2017 via Android
    打错~[12]改[01]
    ilotuo
        24
    ilotuo  
       Dec 5, 2017
    [VerbalExpressions/JSVerbalExpressions: JavaScript Regular expressions made easy]( https://github.com/VerbalExpressions/JSVerbalExpressions )
    tees
        25
    tees  
       Dec 5, 2017
    var reg = /^\d+\.?\d*$/;
    tees
        26
    tees  
       Dec 5, 2017
    var reg = /^\-?\d+\.?\d*$/;
    autoxbc
        27
    autoxbc  
       Dec 5, 2017
    正则难以维护,又没有语义,能不用就不用
    hibobby
        28
    hibobby  
       Dec 5, 2017
    @autoxbc 这句话的来源在哪里?
    vincenttone
        29
    vincenttone  
       Dec 5, 2017
    /\d+(?:\.[05]+)*/
    是这个意思吗?
    iyangyuan
        30
    iyangyuan  
       Dec 5, 2017 via iPhone
    这个需求明显不应该用正则,这是数值处理,不是字符处理
    grayon
        31
    grayon  
       Dec 5, 2017
    ^(?!0$)\d+(\.[05])?$
    akira
        32
    akira  
       Dec 5, 2017
    ^(1|1\.5|0\.5)$ 完美满足啊,1 或者 1.5 或者 0.5 :dodge



    前面数字,后面带 .5 或者 .0 或者没有
    ^(\d+((\.5)?|(\.0)?))$
    xiangbing74
        33
    xiangbing74  
       Dec 5, 2017
    菜🐔
    hzcxdgioa
        34
    hzcxdgioa  
       Dec 5, 2017 via Android
    ^(?!=-)[\d\.]+$

    先匹配正常的数字和小数,然后前面加个负号的否定环视,
    shellfly
        35
    shellfly  
       Dec 5, 2017
    以数字开头,以数字或者.5 结尾?
    /^\d+(.5)?$/g

    ps: 加了 g 参数后,每次 test 好像要把 lastIndex 清零才行。
    freewind
        36
    freewind  
       Dec 5, 2017
    /^(0|\d+(\.[05])?)$/
    feichao
        37
    feichao  
       Dec 5, 2017
    另外一个思路: 先乘以 2, 然后判断是不是整数 这样是不是会简单点?
    zhx1991
        38
    zhx1991  
       Dec 5, 2017
    先判断是不是数字

    然后转成数字

    然后直接判断
    yichinzhu
        39
    yichinzhu  
       Dec 5, 2017 via Android
    今天踩到同样的坑,加了 g 参数之后下次匹配会从 reg.lastIndex 位置开始匹配,直到匹配不到才会把 lastIndex 清零。所以两种方案:
    1. 每次匹配之后手动重置 lastIndex:reg.lastIndex=0
    2. 去掉 g 选项
    JerryV2
        40
    JerryV2  
       Dec 6, 2017
    '\d+(\.5)?'
    JerryV2
        41
    JerryV2  
       Dec 6, 2017
    是必须以 0.5 结尾的数字吗?那就这样呗
    ^\d+\.5$
    FallMonkey
        42
    FallMonkey  
       Dec 6, 2017
    https://regex101.com

    怎么还没人提这个神器?
    jalena
        43
    jalena  
    OP
       Dec 6, 2017
    @JerryV2 0.5 的倍数即可.例如 0.5 , 1,1.5,1.0,2,2.0,2.5 都行
    jxie0755
        44
    jxie0755  
       Dec 6, 2017
    @zpf124 我笑出声了
    keenwon
        45
    keenwon  
       Dec 6, 2017
    ```
    var reg = new RegExp('^\\d+(\\.5)?$');
    var str = '1';
    var str1 = '1.5';
    var str2 = '0.5';
    var str3 = '0';
    var str4 = '0.3';
    var str5 = '-1';
    var str6 = '-1.5';
    var str7 = '2';
    var str8 = '2.5';

    console.log(str + ">>>>>>>>>>>>" + reg.test(str));
    console.log(str1 + ">>>>>>>>>>>>" + reg.test(str1));
    console.log(str2 + ">>>>>>>>>>>>" + reg.test(str2));
    console.log(str3 + ">>>>>>>>>>>>" + reg.test(str3));
    console.log(str4 + ">>>>>>>>>>>>" + reg.test(str4));
    console.log(str5 + ">>>>>>>>>>>>" + reg.test(str5));
    console.log(str6 + ">>>>>>>>>>>>" + reg.test(str6));
    console.log(str7 + ">>>>>>>>>>>>" + reg.test(str7));
    console.log(str8 + ">>>>>>>>>>>>" + reg.test(str8));
    1>>>>>>>>>>>>true
    1.5>>>>>>>>>>>>true
    0.5>>>>>>>>>>>>true
    0>>>>>>>>>>>>true
    0.3>>>>>>>>>>>>false
    -1>>>>>>>>>>>>false
    -1.5>>>>>>>>>>>>false
    2>>>>>>>>>>>>true
    2.5>>>>>>>>>>>>true
    ```
    jason19659
        46
    jason19659  
       Dec 6, 2017
    ^\d+[\.5]*$
    为啥要用正则
    lain0
        47
    lain0  
       Dec 6, 2017
    Morriaty
        48
    Morriaty  
       Dec 6, 2017
    r'^\s*[-+]?(\d+(\.\d*)?|\.\d+)(e[-+]?\d+)?\s*$'

    可匹配任意实数,包括科学计数 1e10,包括正负号
    laoyuan
        49
    laoyuan  
       Dec 6, 2017
    有开头有结尾的 match,又不是抽取,基础正则

    ^\d+((\.5)|(\.0))?$
    willbefly
        50
    willbefly  
       Dec 6, 2017
    ^\d+(\.(5|0))?$
    匹配 1.0 1.5 等

    但有些问题的是 会匹配 0 (应该不匹配) 而且不匹配 1.50 和 1.000 (应该匹配)
    alex14
        51
    alex14  
       Dec 6, 2017
    ^(?![-])\d+(\.[05])?$
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2174 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 107ms · UTC 00:26 · PVG 08:26 · LAX 17:26 · JFK 20:26
    ♥ Do have faith in what you're doing.