代码之家  ›  专栏  ›  技术社区  ›  Jake Metz

正则表达式只允许在浮点小数之前有1个前导零

  •  -1
  • Jake Metz  · 技术社区  · 6 年前

    目前我有以下正则表达式:

    /^[0-9]{0,13}(?:\.[0-9]{0,2})?$/
    

    它允许:

    • 小数点前0到9之间的0到13位数字
    • 小数点后0到2位

    当前通过:

    1000900.87
    65677987897
    908181.0
    .89
    9879
    0.89
    0.9
    

    但是,我希望它只允许1引导0。

    目前,这些考试及格,我希望他们不及格:

    00000001.89
    000.76
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   The fourth bird    6 年前

    当前的正则表达式匹配一个点,但也匹配一个空行,因为所有部分都是可选的,因为 {0,13} )?

    如果不想匹配空字符串,可以使用 alternation 匹配1-13位数字,后跟与点和1-2位数字匹配的可选部分,或 | 只匹配一个点,后跟1-2位数字。

    为了确保数字不以2个或更多的零开头,可以使用负前视来断言不是这样。

    ^(?:(?!0{2,})\d{1,13}(?:\.\d{1,2})?|\.\d{1,2})$
    

    regex demo

    • ^ 字符串的开头
    • (?: 非捕获组
    • (?!0{2,}) 负向前看以确保后面的不是2个或更多的零
    • \d{1,13}(?:\.\d{1,2})? 将1-13位数字与匹配点和1-2位数字的可选部分匹配
    • | 或者
    • \.\d{1,2}) 匹配点和1-2位数字
    • $ 字符串结尾

    编辑:正如@PushpeshKumarRajwanshi所指出的,如果在末尾匹配一个点也是有效的,您可以添加第三个替换 |\d+\. 匹配1+个数字,后跟一个点:

    ^(?!0{2,})(?:\d{1,13}(?:\.\d{1,2})?|\.\d{1,2}|\d+\.)$
    

    查看更新的 Regex demo

        2
  •  0
  •   Pushpesh Kumar Rajwanshi    6 年前

    你可以用否定的眼光 (?!0{2,}) 提前拒绝在输入中包含两个以上前导零的匹配。使用这个正则表达式,

    ^(?!0{2,})[0-9]{0,13}(?:\.[0-9]{0,2})?$
     ^^^^^^^^^ This negative look ahead will reject the match if it sees more than two leading zeroes
    

    Demo

    但是,regex也允许一个点 . 我认为你不应该允许也不应该拒绝这样做,只是在前面再加上一个否定的观点 (?!\.$) 你的正则表达式变好了,

    ^(?!0{2,})(?!\.$)[0-9]{0,13}(?:\.[0-9]{0,2})?$
    

    Demo not allowing just a single dot