让个正则给搞疯了!! - V2EX
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 7345 次点击
    这是一个创建于 2874 天前的主题,其中的信息可能已经有所发展或是发生改变。

    好久没写这些东西!!

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

    大神帮我看看呐。。

    需求: 匹配 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
    hzcxdgoa
        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     Solana     1291 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 17:18 PVG 01:18 LAX 10:18 JFK 13:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86