当前,我有以下正则表达式:
/^[0-9]{0,13}(?:\.[0-9]{0,2})?$/
它允许:
当前通过:
1000900.87
65677987897
908181.0
.89
9879
0.89
0.9
但是,我希望它只允许1前导0。
目前,这些通过了,我希望它们失败:
00000001.89
000.76
答案 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
但是,您的正则表达式也允许单个点.
有效,我认为您不应该允许该点,并且也想拒绝该点,只需在前面添加另一个否定的外观即可
(?!\.$)
,您的正则表达式会变得更好,
^(?!0{2,})(?!\.$)[0-9]{0,13}(?:\.[0-9]{0,2})?$