Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我如何简单地使用这个数字格式验证正则表达式?_Javascript_Regex_Regex Negation - Fatal编程技术网

Javascript 我如何简单地使用这个数字格式验证正则表达式?

Javascript 我如何简单地使用这个数字格式验证正则表达式?,javascript,regex,regex-negation,Javascript,Regex,Regex Negation,因此,我有一个if语句: if(String(val).search(/^((\d+)((\,\d{3,}+)+)(\。\d+))(\。\d+)$/)!=-1) (据我所知): 字符串必须至少以一位数字开头,或以开头 如果字符串以数字开头,则可以选择在字符串中使用逗号,只要逗号后面至少有三位数字。 如果字符串中有,则后面必须至少有一位数字。 只能有一个 因此,字符串如下: 5 5.00 5000英镑 5000英镑 5000.00 5000.00 一切都会变成现实吗 但是包含除0-9、.以外的任何

因此,我有一个if语句:
if(String(val).search(/^((\d+)((\,\d{3,}+)+)(\。\d+))(\。\d+)$/)!=-1)

(据我所知):
字符串必须至少以一位数字开头,或以
开头
如果字符串以数字开头,则可以选择在字符串中使用逗号,只要逗号后面至少有三位数字。 如果字符串中有
,则后面必须至少有一位数字。
只能有一个

因此,字符串如下:

5
5.00
5000英镑
5000英镑
5000.00
5000.00

一切都会变成现实吗

但是包含除
0-9、.
以外的任何内容或格式不正确的字符串将返回false。 所以像这样的字符串:

^(\d+(\,\d{3,})*(\.\d+)?|\.\d+)$
^(\d{1,3}(\,\d{3})*(\.\d+)?|\.\d+)$
5,00
5,00.00
5.00.00
a5


现在,上面的方法可行了,但我想知道是否有任何方法可以简化它?

您可以删除一些多余的括号:

^(\d+((\,\d{3,})+)?(\.\d+)?|\.\d+)$
类似于
(…)+)?
的内容可以替换为:
(…)*
,因此最终的正则表达式可能如下所示:

^(\d+(\,\d{3,})*(\.\d+)?|\.\d+)$
^(\d{1,3}(\,\d{3})*(\.\d+)?|\.\d+)$
如果你想拒绝输入,比如:

50000,000,000.0
并且只允许:

5,000,000.0
50,000,000.0
500,000,000.0
然后像这样做:

^(\d+(\,\d{3,})*(\.\d+)?|\.\d+)$
^(\d{1,3}(\,\d{3})*(\.\d+)?|\.\d+)$

我不认为你可以简化它,除了去掉几个paren,因为它可以说是不够复杂。该模式还允许格式错误的字符串,例如

50000,000,000.000000000

谁没有评论就投了反对票?这个问题怎么了?我试图理解它,并让它发挥作用,那么为什么要投否决票呢?我不是说,我想让你为我写这个正则表达式!@海尔伍德:这两张落选票都不是我的,但是你的头衔让你投了落选票,尽管这个问题(在我看来)不值得。我建议将其改为“如何简化此正则表达式?”而不是要求“简化此正则表达式!”干杯,标题并非要求严格,只是简洁;)我已经将它更新为更友好的版本。听起来你在尝试改进一些代码,而不仅仅是学习正则表达式。通过发现并考虑代码的用途,您将更有效地改进代码。您是否正在尝试防止数据输入错误?如果是这样,您是否需要允许南亚人输入其习惯格式“100,00,00000”?或者您可能正在检查存储为字符串的数字数据库?如果是这样的话,为什么它们会以这种方式存储?@minopret确实如此,使用正则表达式的原因是,如果文本输入的值被认为是有效的,那么它就会被应用到jQuery插件中,否则就不会。它也只会在新西兰的网站上使用,这样,这个正则表达式不需要国际货币格式,至于学习,我试过阅读教程和书籍等,但我不是这样学习的,我是通过做来学习的,因此,我会尽我所能,然后在这里分享,看看下次可以改进什么。嗯,您是对的,因此,我可以用
\d{2}
替换
\d+
的两个实例。至于第一部分。。。是时候看看正则表达式是否有回溯了,这样我就可以看到,在逗号之前是否有三个数字,然后是逗号,或者至少有一个数字和行的开头@海尔伍德,你可以用
^(\d+…
替换
^(\d{1,3}…
事实上,我撒谎,那太复杂了,
\d{3,3}
而不是
\d{3,}
应该work@Hailwood,我想我们讨论的是一些不同的东西…请参阅我编辑的答案以获得修复。另外,
\d{3,3}
=
\d{3}
@BartKiers啊,是的,你指的是字符串的开头,它停止50000,但是如果你只改变它,那么50000000000仍然有效,所以如果我们把它们结合起来,最后得到
(\.\d{1,3}(\,\d{3})*(\.\d{1,2})\.\d{1,2})$
,那么这将修复它,意味着只有5000000是有效的