正则表达式以匹配数字与十进制分隔符和可选的千位分隔符

Dzy*_*ann 8 regex

我需要使用小数分隔符和千位分隔符来验证数字是否有效.我需要一个正则表达式,因为当前的代码,我没有使用正则表达式不能正常工作,我的目标是解决它.

所以以下组合是合法的(使用.小数分隔符和,千分隔符)

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

但以下不合法:

  • 10000,000,000.34534

基本上我想要正确使用十进制和千位分隔符或根本没有它们的数字,但不是无效的组合.我环顾四周,到目前为止,我找到了这篇文章.当数字有十进制分隔符和千位分隔符时,它有一个很好的正则表达式匹配,但是当我尝试添加其他选项(仅带小数分隔符或数字整数的数字)时,我打破了表达式.

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

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

第一组是从另一个帖子的表达,第二组我认为用小数分隔符覆盖数字,最后一个是整数,但它不起作用.

例如,这些数字不匹配:

  • 10000000.56
  • 千万

我认为这个问题正在发生,因为它总是测试第一组,但我不确定如何正确使用组,因此它匹配其中任何一个.另外我想我会把 - +标志放在错误的地方.

我做了很多搜索,找不到一个正常工作的表达.从建议的:

正则表达式与小数号码和千周分隔符

  • ((\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失败

可以在正则表达式中使用OR而不捕获所包含的内容吗?帖子不是重复的,它解释了可以帮助我解决问题的东西,但它不是重复的,特别是因为我也有+ - 符号的问题.此外,我的问题涵盖了一个对我来说不是特别的问题,这是许多人面临的问题,但从我迄今为止发现的实现来看,没有任何问题.

RegEx结果数字值有或没有千位分隔符发布

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

Bar*_*mar 11

第二种选择不匹配的原因是因为它只允许\f小数点后的单个.这需要\d+.

然后你需要在组之间^$组中包装所有内容,因此所有选项都匹配整个字符串.

你有很多冗余的括号.而\d*在最后的选择应该是\d+,否则你会允许一个数字,是完全空或只是一个标志.

^[+-]?([0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?|\d*\.\d+|\d+)$
Run Code Online (Sandbox Code Playgroud)
  • ^ - >字符串的开头
  • [+-]?- >匹配optional +-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


anu*_*ava 6

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

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

正则表达式演示

它匹配以下情况:

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

  • 是的,我的错,我最后做了一个小改动,破坏了它。我现在已经在回答和演示中修复了它。这个正则表达式仍然更短更快,它将涵盖 OP 中提到的所有情况。如果有什么不工作,请告诉我。 (3认同)
  • 不,它没有。例如,正如您的演示所证明的那样,它不适用于“100,000,000”,并且无法验证其他数字的 *loads*。这没有用。 (2认同)