Javascript regex只允许输入3位小数,0.001是可能的最小数字,而不是0

Javascript regex只允许输入3位小数,0.001是可能的最小数字,而不是0,javascript,regex,ecmascript-6,Javascript,Regex,Ecmascript 6,我正在尝试编写一个正则表达式,允许用户输入正数和小数点后3位。我的正则表达式看起来像这样,但是,它不是我想要的那样工作 /\d*[1-9](\.\d{0,3})?/ 这允许用户输入1.000作为最小的数字,但不允许用户输入0.001,这应该是输入的最小数字 有人知道正则表达式应该是什么来解决这个问题吗?答案在这里 ([1-9]\.[0-9][0-9][0-9]|[0]\.[1-9][0-9][0-9]|[0]\.[0][1-9][0-9]|[0]\.[0][0][1-9]) 这应该与0.00

我正在尝试编写一个正则表达式,允许用户输入正数和小数点后3位。我的正则表达式看起来像这样,但是,它不是我想要的那样工作

/\d*[1-9](\.\d{0,3})?/
这允许用户输入
1.000
作为最小的数字,但不允许用户输入
0.001
,这应该是输入的最小数字

有人知道正则表达式应该是什么来解决这个问题吗?

答案在这里

([1-9]\.[0-9][0-9][0-9]|[0]\.[1-9][0-9][0-9]|[0]\.[0][1-9][0-9]|[0]\.[0][0][1-9])
这应该与0.001~9.999相匹配,答案在这里

([1-9]\.[0-9][0-9][0-9]|[0]\.[1-9][0-9][0-9]|[0]\.[0][1-9][0-9]|[0]\.[0][0][1-9])

这应该匹配0.001~9.999

就我个人而言,我只需要检查0并使正则表达式更简单,但这里有一个解决方案,可以通过更改{1,3}来调整所需的小数位数

这个正则表达式的jist是,我们允许任何大于两位数的数字,然后只允许1-9表示一位数,然后可选地要求最多1位小数,后面是1-3位数

const r=/^(([0-9]{2,}){1}{1})(\[0-9]{1,3}){0,1}$/;
常数测试=['1'、'2'、'0'、'1.001'、'1.001.1'、'999.001'、'9.01'、'9.0100'、'abc'];

tests.forEach(t=>console.log(t,r.test(t))我个人只需要检查0并使正则表达式简单得多,但这里有一个解决方案,可以通过更改{1,3}来调整所需的小数位数

这个正则表达式的jist是,我们允许任何大于两位数的数字,然后只允许1-9表示一位数,然后可选地要求最多1位小数,后面是1-3位数

const r=/^(([0-9]{2,}){1}{1})(\[0-9]{1,3}){0,1}$/;
常数测试=['1'、'2'、'0'、'1.001'、'1.001.1'、'999.001'、'9.01'、'9.0100'、'abc'];

tests.forEach(t=>console.log(t,r.test(t))您的代码存在另一个问题,即它不能匹配10,因为您不允许1的位置为0

您需要使用一些或语句

const re=/(^([1-9]|\d{2,})(\.\d{0,3})?|0\.\d{0,2}[1-9])$/
常数测试=[“0.001”、“0.1”、“0”、“0.0”、“0.000”、“10.001”、“10”、“11”、“1”]

tests.forEach(n=>console.log(n,re.test(n))
您的代码存在另一个问题,它不能与10匹配,因为您不允许1的位置为0

您需要使用一些或语句

const re=/(^([1-9]|\d{2,})(\.\d{0,3})?|0\.\d{0,2}[1-9])$/
常数测试=[“0.001”、“0.1”、“0”、“0.0”、“0.000”、“10.001”、“10”、“11”、“1”]
tests.forEach(n=>console.log(n,re.test(n)))
const re=/^(?!0+(?:\.0+)\d+(?:\.\d+)$/
常数测试=[“0.001”、“0.1”、“0”、“0.0”、“0.000”、“10.001”、“10”、“11”、“1”、“1.22”、“1.222”]
tests.forEach(n=>console.log(n,re.test(n)))
const re=/^(?!0+(?:\.0+)\d+(?:\.\d+)$/
常数测试=[“0.001”、“0.1”、“0”、“0.0”、“0.000”、“10.001”、“10”、“11”、“1”、“1.22”、“1.222”]

tests.forEach(n=>console.log(n,re.test(n))
另一个选项是使用负的前向断言,从字符串开始,右边的内容在字符串结束之前既不是点也不是零:

^(?![0.]+$)\d+(?:\.\d{1,3})?$

解释

  • ^
    字符串的开头
  • (?![0.]+$)
    断言右侧的内容不是字符类中列出的内容的负前瞻,重复1次以上直到字符串结束
  • \d+
    匹配数字的1+倍
  • (?:\。\d{1,3})?
    可选的非捕获组,它匹配一个点和一个数字的1+倍
  • $
    字符串的结尾

另一个选项是使用负向前看,从字符串开始断言右侧的内容在字符串结束之前既不是点也不是零:

^(?![0.]+$)\d+(?:\.\d{1,3})?$

解释

  • ^
    字符串的开头
  • (?![0.]+$)
    断言右侧的内容不是字符类中列出的内容的负前瞻,重复1次以上直到字符串结束
  • \d+
    匹配数字的1+倍
  • (?:\。\d{1,3})?
    可选的非捕获组,它匹配一个点和一个数字的1+倍
  • $
    字符串的结尾
const测试=[“0.001”、“0.1”、“0”、“0.0”、“0.000”、“10.001”、“10”、“11”、“1”、“1.22”、“1.222”]
tests.forEach(n=>console.log(parseFloat(n)>=0.001))
const测试=[“0.001”、“0.1”、“0”、“0.0”、“0.000”、“10.001”、“10”、“11”、“1”、“1.22”、“1.222”]

tests.forEach(n=>console.log(parseFloat(n)>=0.001))
您是如何实现这个正则表达式的?为什么不检查输入是否>=0.001?另一个非正则表达式解决方案将与满足“小数点后3位”要求的
number.toFixed(3)
匹配。该代码不允许
10.001
如何实现此正则表达式?为什么不检查输入是否>=0.001?另一个非正则表达式解决方案是将其与
number.toFixed(3)
匹配,它满足“小数点后3位”的要求。该代码不允许
10.001
标题说“0.001是可能的最小数字,而不是0”。此外,它没有说“小于10”1.000是最大的数字吗?我稍后会修改答案。OP的要求没有上限。编辑后不匹配,例如,0.020标题说“0.001是可能的最小数字,而不是0”。此外,它没有说“小于10”1.000是最大数字吗?我稍后会修改答案。OP的要求中没有上限。编辑后它不匹配,例如,0.020嘿,这对我来说不太合适。一个问题是我最多只能输入小数点,即
1.22
。如果我尝试
1.222
它不允许这样嘿,这对我来说真的不起作用。一个问题是我最多只能输入小数点,即
1.22
。如果我尝试
1.222
它不允许这样做,我真的很喜欢正则表达式的解释,有没有一个工具可以把它吐出来呢?我同意。厕所