推荐关注
› Meteor
› JSLint - a JavaScript code quality tool
› jsFiddle
› D3.js
› WebStorm
推荐书目
› JavaScript 权威指南第 5 版
› Closure: The Definitive Guide
jalena

让个正则给搞疯了!!

  •  
  •   jalena · Dec 5, 2017 · 8181 views
    This topic created in 3255 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
    abclearner
    Dec 5, 2017
    1
    ^\d.?\d?
    bramblex
    bramblex
    Dec 5, 2017❤️2
    2
    parseInt(str) > 0 && parseInt(str).toString() === str

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

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



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

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

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

    然后转成数字

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

    怎么还没人提这个神器?
    jalena
    jalena
    OP
    Dec 6, 2017
    43
    @JerryV2 0.5 的倍数即可.例如 0.5 , 1,1.5,1.0,2,2.0,2.5 都行
    jxie0755
    jxie0755
    Dec 6, 2017
    44
    @zpf124 我笑出声了
    keenwon
    keenwon
    Dec 6, 2017
    45
    ```
    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
    jason19659
    Dec 6, 2017
    46
    ^\d+[\.5]*$
    为啥要用正则
    lain0
    lain0
    Dec 6, 2017
    47
    Morriaty
    Morriaty
    Dec 6, 2017
    48
    r'^\s*[-+]?(\d+(\.\d*)?|\.\d+)(e[-+]?\d+)?\s*$'

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

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

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