正则表达式仅在浮点十进制之前允许1前导零

时间:2019-02-01 04:37:09

标签: regex

当前,我有以下正则表达式:

/^[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 个答案:

答案 0 :(得分:1)

您当前正则表达式匹配的单个点,但因为所有的部分是可选的,由于{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

答案 1 :(得分:0)

您可以使用(?!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

但是,您的正则表达式也允许单个点.有效,我认为您不应该允许该点,并且也想拒绝该点,只需在前面添加另一个否定的外观即可 (?!\.$),您的正则表达式会变得更好,

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

Demo not allowing just a single dot