wdc63

求给生成一个正则表达式,年龄大了,脑子不够用了

  •  
  •   wdc63 · Jun 25, 2022 · 3692 views
    This topic created in 1597 days ago, the information mentioned may be changed or developed.

    1 必须是合法数字(前面不能多个 0 ) 2 范围必须在-1000 到 1000 之间(包括-1000 和 1000 ) 3 可以是整数,可以是小数,如果是小数位数必须小于等于两位

    例如 0.001 、9999 、-1.010 、01.32 不合法 99.99 、0 、-1.2 合法

    24 replies  •  2022-06-25 20:46:25 +08:00
    golangLover
    golangLover
    Jun 25, 2022 via Android
    1
    如果这个东西难以表达,那根本不应该用正则
    wdc63
    wdc63
    OP
    Jun 25, 2022
    2
    @golangLover 老大说正则效率最高,考虑正则优先,我也想写几条 if else ,实在不好搞就算了吧
    ETiV
    ETiV
    Jun 25, 2022
    3
    试着玩了玩。。。

    正则

    ^-?(((?!0+)1?[0-9]{0,3})|0)(\.[0-9]{1,2})?$

    以及在 regex101 上的 test case
    https://regex101.com/r/2gbObg/1
    ETiV
    ETiV
    Jun 25, 2022
    4
    658 steps, 0.2ms

    整体来看效率并不高 🤣(小心 RegEx DoS 攻击)
    autoxbc
    autoxbc
    Jun 25, 2022❤️3
    5
    正则被广泛使用的原因是它是线性书写的语言,没有任何结构,也就可以在无需约定结构的前提下,在各种高级语言中嵌入

    这个优点也正是正则的缺点,因为没有结构,在人类可读的范围内,表达力严重受限,完全无法和有控制流的高级语言相比

    所以正则的场景就是稍微浅浅的用一下,如果普通水准的程序员无法顺利写出来,那么最终写出来了别人也无法顺利读懂
    zjp
    zjp
    Jun 25, 2022 via Android
    6
    ^-?(0|1000|[1-9]\d{0,2}(?:\.\d{1,2})?)$
    https://regexr.com/6offc
    确定是数字的情况肯定 if else 更高
    而且你能确定这些表达式没有问题吗
    jfcherng
    jfcherng
    Jun 25, 2022
    7
    如樓樓上所說的,不解釋的話你很可能得花很多時間才能看懂在寫什麼,或是根本看不懂。
    https://regex101.com/r/yKSTiy/1
    zjp
    zjp
    Jun 25, 2022 via Android
    8
    @zjp 果然 括号括错了
    https://regex101.com/r/lf70Du/2 (用了#3 的测试用例
    ntdll
    ntdll
    Jun 25, 2022
    9
    ^-?(?:[1-9]{1,1}\d{0,}|0)(?:\.\d{0,}[^0]|)$

    但是可读性真的很差,而且速度也不快。

    怀疑可能是 X-Y 问题,多数情况下可以利用语言提供的 parseInt/parseFloat 一类的方法来处理,但是又要排除 01.32 这种情况,着实有点奇怪。
    darklights
    darklights
    Jun 25, 2022
    10
    3 楼和 8 楼的大佬给出的已经很接近了,但还是有例外( 1000.99 )

    不建议用正则处理这类多重逻辑的问题,可读性是其次,要考虑到所有可能的情况才是最伤脑细胞的,然而几个 if else 就能解决。用合适工具解决合适问题。
    muhuan
    muhuan
    Jun 25, 2022
    11
    ^-?(((([1-9][0-9]{0,2})|0)(\.[0-9]{1,2})?)|(1000))$
    Mutoo
    Mutoo
    Jun 25, 2022
    12
    Mutoo
    Mutoo
    Jun 25, 2022
    13
    https://rulex-rs.github.io/playground/

    # -1000 ~ 1000
    ['-+']?
    %
    range '0'-'1000'
    ('.' ['0'-'9']+)?
    %


    to javascript:

    [\-+]?\b(?:0|1(?:0(?:00?|[1-9])?|[1-9][0-9]?)?|[2-9][0-9]{0,2})(?:\.[0-9]+)?\b
    Mutoo
    Mutoo
    Jun 25, 2022
    14
    忘了处理两位小数了,不过用 rulex 语法还是很容易写出来的。有兴趣可以自己试试
    cpstar
    cpstar
    Jun 25, 2022
    15
    既然是数字,为什么偏要用字符串的处理方式?还断言效率高??
    1. ""+(x*1)==""+x
    2. -1000≤(x*1)≤1000
    3. x.indexOf(".")==-1||x.length-x.indexOf(".")-1≤2
    这不比正则快?写正则折腾半天,解析正则折腾半天。
    snw
    snw
    Jun 25, 2022 via Android
    16
    正则效率高是针对字符串简单规则,而且需要经验不然很容易踩坑。你这种数字需求并不适合用正则。
    snw
    snw
    Jun 25, 2022 via Android
    17
    对了,如果科学计数法参合进来就更烧脑了。
    1.
    .1
    +1
    1E2
    1e2
    1e+2
    1.e+2
    1.000e+2
    1e-2
    -1e2
    Tink
    Tink
    Jun 25, 2022 via Android
    18
    费脑子
    Nasei
    Nasei
    Jun 25, 2022
    19
    ^-?(([1-9]\d{0,2}|0)(\.\d\d)?|1000)$
    cheng6563
    cheng6563
    Jun 25, 2022
    20
    正则不适合用来比较数字大小
    wdc63
    wdc63
    OP
    Jun 25, 2022
    21
    @ETiV 谢谢,我也测试一下 if else 看看哪个快
    wdc63
    wdc63
    OP
    Jun 25, 2022
    22
    @cpstar 获取用户的输入框,不确定是数字,就是用正则来写一个输入框的 validation ,但是在服务器上运行,不在本地运行。
    wdc63
    wdc63
    OP
    Jun 25, 2022
    23
    谢谢各位, 昨晚睡了没及时回复,在此不再一一道谢。
    cpstar
    cpstar
    Jun 25, 2022
    24
    OP 22#,所以你看我把 x 当成字符串处理了,x*1 才是数字型。服务器上运行也可以啊,只不过不想 javascript 那种弱类型,比如 Float.parseFloat(),多几道手续而已。

    另外 H5 提供了<input type="number" name="marks" min="-1000.00" max="1000.00" step="0.01">

    我觉得如果非要限定某种方法解决问题,那实际上就并不是在解决问题,而在钻牛角尖。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   659 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 20:09 · PVG 04:09 · LAX 12:09 · JFK 15:09
    ♥ Do have faith in what you're doing.