怎么匹配0到2000的数字?

只能是0-2000的数字,我写得正则是

var p = /1\d{3}|2000|^[1-9]\d{0,2}$|^0$/

但是不知道为啥能匹配到019 0199这样的字符,正则哪里写错了,谁能告诉一下啊?

阅读 5.9k
8 个回答

你这个正则有个问题,就是的一个或1d{3}并未强制要求开头和结尾,意味着只要有一1开头的连续4位数字的都可以匹配上。

console.log(/1\d{3}/.test('01999'))

首先,可以直接在你这个基础上改一下

var reg = /^0*1\d{3}$|2000|^0*[1-9]\d{0,2}$|^0*$/;
['019', '0199', '01999', '001999', '019990'].forEach(v => console.log(v, reg.test(v)))

然后,还有一种更常规的解决办法是

function test(str){
  let num = Number(str);
  return (num || num===0) && num>=0 && num <=2000;
}
['019', '0199', '01999', '001999', '019990'].forEach(v => console.log(v, test(v)))

正则匹配的都是字符串吧?019 0199 先转为 '19' 和 '199' 了,就 true 了吧

019, 0199 如果直接写成数字的形式就相当于于是19,199。如果写成字符串形式,就可以达到你的要求

正则如下:

var reg = /^((\d{1,3})|(1\d{3})|(2000))$/;

解释:匹配任意的1到3位数(0~999),匹配任何1开头的4位数(1000~1999),匹配2000
注意:| 符号各项使用小括号,最后,各或项之外使用小括号括起来。形式:/^((a)|(b)|(c))$/。

整数019匹配正则的时候,转化为字符串,所以019=>'19'。

var reg = /^1\d{3}$|2000|^\d{1}&|^([1-9]\d{1})&|^([1-9]\d{2})&/;
reg.test(01)   #false
reg.test(11)   #false

这样写可以控制01 011 0111这样输入了,返回false了,但是尴尬的是1,11,111这样的输入也返回了false

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏