正则表达式匹配带小数分隔符和可选千位分隔符的数字

时间:2018-12-17 21:07:38

标签: regex

我需要使用小数点分隔符和千位分隔符来验证数字是否有效。我需要一个正则表达式,因为当前代码(不是我自己完成的)使用的正则表达式无法正常工作,我的目标是修复它。

因此以下组合是合法的(使用.作为小数分隔符,,作为千位分隔符)

  • 10000
  • 100,000,000
  • 100,000,000.345345
  • 10000.689

但是以下内容不合法:

  • 10000,000,000.34534

基本上我希望数字能正确使用小数和千位分隔符,或者根本不使用数字,但不是无效的组合。 我四处张望,到目前为止,我发现了this post。 Wich有一个很棒的正则表达式,当数字具有小数点分隔符和千位分隔符时,它可以完美匹配,但是当我尝试添加其他选项(仅带小数点分隔符的数字或数字整数)时,我会破坏表达式。

我决定也许我可以用或捕获与规则匹配的组,因此数字可以像这样匹配一个表达式或另一个表达式:

^([+-]?[0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?)|(((\d)*)+?(\.\d))|(\d*)$

第一组是另一个帖子的表达式,我认为第二组包含带小数点分隔符的数字,最后一个是整数,但是不起作用。

例如,这些数字不匹配:

  • 10000000.56
  • 10000000

我认为这是正在发生的问题,因为它总是测试第一个组,但是我不确定如何正确使用这些组,以使其与它们中的任何一个都匹配。另外,我认为我将-+号放在错误的位置。

我确实搜索了很多,却找不到一个可以正常工作的表达式。从建议的那些:

来自Regex for number with decimals and thousand separator帖子

  • ((\d){1,3})+([,][\d]{3})*([.](\d)*)?->错误地捕获了10000000和10,000,000。
  • ^(?!0+\.00)(?=.{1,9}(\.|$))\d{1,3}(,\d{3})*(\.\d+)?$->失败10000000
  • /^(?!0+\.00)(?=.{1,9}(\.|$))(?!0(?!\.))\d{1,3}(,\d{3})*(\.\d+)?$/->失败10000000
  • ((\d){1,3})+([,][\d]{3})*([.](\d)*)?->对于-100.03失败

Can I use an OR in regex without capturing what's enclosed?帖子不是重复的,它解释了可以帮助我解决问题的内容,但是不是重复的,特别是因为我在+号上也遇到了问题。另外,我的问题涵盖的问题并非我所特有,这是许多人面临的问题,但是从我到目前为止发现的实现来看,这没有用。

来自RegEx matcing numeric values with or without thousand separators帖子

  • ^-?([0-9]{1,3}\.?)+$->对于-1000失败,但对于100.00.3失败,而不是
  • ^-?(?!0)(?:\d+|\d{1,3}(?:\.\d{3})+)$->对于-100.03失败

2 个答案:

答案 0 :(得分:12)

第二个替代项不匹配的原因是,它仅允许小数点后的一个\f。必须为\d+

然后,您需要将^$之间的所有内容包装在一个组中,以便所有替代项都匹配整个字符串。

您有很多多余的括号。而最后一个选择中的\d*应该是\d+,否则您将允许一个完全为空的数字或只是一个符号。

^[+-]?([0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?|\d*\.\d+|\d+)$
  • ^->字符串开头
  • [+-]?->匹配可选的+- char
  • ([0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?|\d*\.\d+|\d+)->整个小组 必须匹配[0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)\d*\.\d+\d+
    • [0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)->匹配带有千位分隔符和十进制分隔符的数字
    • \d*\.\d+->用小数点分隔符匹配数字,并且可能用小数点前的数字
    • \d+->匹配不带小数点分隔符的数字
  • $->字符串结尾

DEMO

答案 1 :(得分:3)

您可以使用此正则表达式进行验证:

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

RegEx Demo

它匹配以下情况:

  • 一个整数
  • 浮点数
  • 第3位带有分隔符,的数字