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

让个正则给搞疯了!!

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

    好久没写这些东西!!

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

    大神帮我看看呐。。

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

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

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

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

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

    然后转成数字

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

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

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

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

    但有些问题的是 会匹配 0 (应该不匹配) 而且不匹配 1.50 和 1.000 (应该匹配)
        51
    alex14   2017-12-06 17:09:27 +08:00
    ^(?![-])\d+(\.[05])?$
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   936 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 29ms · UTC 19:59 · PVG 03:59 · LAX 11:59 · JFK 14:59
    ♥ Do have faith in what you're doing.