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