我怎样才能简单地使用这种数字格式验证正则表达式?

Posted

技术标签:

【中文标题】我怎样才能简单地使用这种数字格式验证正则表达式?【英文标题】:How can I simply this number format validation regex? 【发布时间】:2012-10-29 16:48:32 【问题描述】:

所以,我有这个 if 语句:if (String(val).search(/^((\d+(((\,\d3,)+)?)(\.\d+)?)|(\.\d+))$/) !== -1)

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

所以,像这样的字符串:

5 5.00 5000 5,000 5000.00 5,000.00

都会返回true

但包含除0-9 , . 之外的任何内容或格式错误的字符串将返回 false。 所以像这样的字符串:

5,00 5,00.00 5.00.00 一个5

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

【问题讨论】:

谁在没有评论的情况下投了反对票?这个问题有什么问题?我试图理解它并让它发挥作用,那么为什么要投反对票呢?这不像我只是说,我希望你为我写这个正则表达式! @Hailwood:这两个反对票都不是我的,但你的头衔让你支持反对票,即使这个问题(在我看来)并不值得。我建议将其更改为“如何简化此正则表达式?”而不是要求“简化这个正则表达式!” 干杯,标题并不是要求苛刻,只是简洁;)我已经将它更新为更友好的东西。 听起来您是在尝试改进一些代码,而不是简单地尝试学习正则表达式。通过找出并考虑其目的,您将更有效地改进代码。您是否试图防止数据输入错误?如果是这样,您是否需要允许南亚人输入他们习惯的格式“100,00,00,000”?或者您是否正在检查存储为字符串的数字数据库?如果是这样,为什么要这样存储它们? @minopret 两者都是,正则表达式的原因是,如果文本输入的值被认为是有效的,那么它会被应用一个 jQuery 插件,否则它不会。它也只会用于新西兰的网站,等等,这个正则表达式不需要国际货币格式,至于学习,我试过阅读教程和书籍等,但我不学习这样,我边做边学,因此,我会尽我所能,然后在这里分享,看看下次可以改进什么。 【参考方案1】:

你可以去掉一些多余的括号:

^(\d+((\,\d3,)+)?(\.\d+)?|\.\d+)$

(( ... )+)? 这样的东西可以替换为:( ... )*,所以最终的正则表达式可能如下所示:

^(\d+(\,\d3,)*(\.\d+)?|\.\d+)$

如果您想拒绝以下输入:

50000,000,000.0

并且只允许:

5,000,000.0
50,000,000.0
500,000,000.0

然后做这样的事情:

^(\d1,3(\,\d3)*(\.\d+)?|\.\d+)$

【讨论】:

【参考方案2】:

我认为你不能简化它,除了去掉几个括号外,它可能还不够复杂。该模式还将允许格式错误的字符串,例如

50000,000,000.000000000

【讨论】:

嗯,你是对的,所以,我相信我可以用.\d2 替换.\d+ 的两个实例。至于第一个,部分......是时候看看正则表达式是否有回溯,所以我可以看看,在逗号之前是否有三个数字,然后是一个逗号,或者至少一个数字和行首! @Hailwood,你可以用^(\d1,3...替换^(\d+... 其实,我说谎了,这太复杂了,\d3,3 而不是\d3, 应该可以工作 @Hailwood,我想我们在谈论一些不同的东西......请参阅我编辑的答案以获取修复。另外,\d3,3 == \d3 @BartKiers 啊,是的,你指的是字符串的开头,它停止 50000 但如果你只改变它,那么 500,00000,000 仍然有效,所以如果我们将它们结合起来以^(\d1,3(\,\d3)*(\.\d1,2)?|\.\d1,2)$ 结束,那么这将解决它并意味着只有例如5,000,000 有效

以上是关于我怎样才能简单地使用这种数字格式验证正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章

JS正则验证两位小数,验证数字最简单正则表达式大全

正则表达式验证邮箱格式是啥?

JS正则验证数字格式2

jQuery验证日期的正则表达式(这种格式2015-07-03 14:24)

JS验证正数字,正则的一种正数规则1

求验证中文正则表达式