V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
jalena
V2EX  ›  JavaScript

让个正则给搞疯了!!

  •  
  •   jalena · 2017-12-05 13:35:58 +08:00 · 6961 次点击
    这是一个创建于 2552 天前的主题,其中的信息可能已经有所发展或是发生改变。

    好久没写这些东西!!

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

    大神帮我看看呐。。

    需求: 匹配 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 条回复    2017-12-06 17:09:27 +08:00
    abclearner
        1
    abclearner  
       2017-12-05 13:44:14 +08:00
    ^\d.?\d?
    bramblex
        2
    bramblex  
       2017-12-05 13:47:51 +08:00   ❤️ 2
    parseInt(str) > 0 && parseInt(str).toString() === str

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

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



    前面数字,后面带 .5 或者 .0 或者没有
    ^(\d+((\.5)?|(\.0)?))$
    xiangbing74
        33
    xiangbing74  
       2017-12-05 22:29:41 +08:00
    菜🐔
    hzcxdgioa
        34
    hzcxdgioa  
       2017-12-05 22:52:21 +08:00 via Android
    ^(?!=-)[\d\.]+$

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

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

    然后转成数字

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

    怎么还没人提这个神器?
    jalena
        43
    jalena  
    OP
       2017-12-06 09:29:22 +08:00
    @JerryV2 0.5 的倍数即可.例如 0.5 , 1,1.5,1.0,2,2.0,2.5 都行
    jxie0755
        44
    jxie0755  
       2017-12-06 09:54:48 +08:00
    @zpf124 我笑出声了
    keenwon
        45
    keenwon  
       2017-12-06 10:29:05 +08:00
    ```
    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  
       2017-12-06 10:38:06 +08:00
    ^\d+[\.5]*$
    为啥要用正则
    lain0
        47
    lain0  
       2017-12-06 11:24:59 +08:00
    Morriaty
        48
    Morriaty  
       2017-12-06 11:41:57 +08:00
    r'^\s*[-+]?(\d+(\.\d*)?|\.\d+)(e[-+]?\d+)?\s*$'

    可匹配任意实数,包括科学计数 1e10,包括正负号
    laoyuan
        49
    laoyuan  
       2017-12-06 11:56:21 +08:00
    有开头有结尾的 match,又不是抽取,基础正则

    ^\d+((\.5)|(\.0))?$
    willbefly
        50
    willbefly  
       2017-12-06 16:35:44 +08:00
    ^\d+(\.(5|0))?$
    匹配 1.0 1.5 等

    但有些问题的是 会匹配 0 (应该不匹配) 而且不匹配 1.50 和 1.000 (应该匹配)
    alex14
        51
    alex14  
       2017-12-06 17:09:27 +08:00
    ^(?![-])\d+(\.[05])?$
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2780 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:54 · PVG 13:54 · LAX 21:54 · JFK 00:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.