【问题标题】:Regular expression to match number with Decimal separator and optional Thousands separator正则表达式匹配数字与小数分隔符和可选的千位分隔符
【发布时间】:2018-12-17 21:07:38
【问题描述】:

我需要验证一个数字是否有效,可以选择使用小数分隔符和千位分隔符。我需要一个正则表达式,因为我没有完成的当前代码使用了一个不能正常工作的正则表达式,我打算修复它。

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

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

但以下内容不合法:

  • 10000,000,000.34534

基本上我想要正确使用小数和千位分隔符或根本不使用它们的数字,但不是无效的组合。 我环顾四周,到目前为止我找到了this post。当数字有小数分隔符和千位分隔符时,它有一个很好的正则表达式,但是当我尝试添加其他选项(只有小数分隔符的数字或数字整数)时,我会破坏表达式。

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

^([+-]?[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 matching numeric values with or without thousand separators 帖子

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

【问题讨论】:

标签: regex


【解决方案1】:

第二种选择不匹配的原因是因为它只允许在小数点后有一个\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

【讨论】:

  • 感谢您的回答,您的表达方式差不多,但是当我使用像-1000003.65这样的数字时,它会失败,但它适用于-1,000,003.65
  • [+-]? 仅在第一个备选方案中,它需要在备选方案组之外,以便您可以在任何格式之前放置符号。
  • 我不想打扰你,所以我编辑了你的问题,稍作改动。您的正则表达式匹配“.7”为有效,这是因为 (\d)*) 我将其更改为 (\d)+)。然后我添加了一个简短的分解部分,看看我是否做对了。如果您不喜欢它,请随时回滚。
  • 如果您同意我的更改或者您想进行更新(我没有更新您的演示链接),请告诉我,我会接受您的回答。
  • 我认为.7 应该是有效的,我们有时会写分数而不在. 之前添加任何内容
【解决方案2】:

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

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

RegEx Demo

匹配以下情况:

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

【讨论】:

  • 不,它没有。例如,它不适用于100,000,000,正如您的演示所证明的那样,并且无法验证 loads 的其他数字。这没用。
  • 是的,我的错,我最后做了一个小改动,把它弄坏了。我现在已经在答案和演示中修复了它。这个正则表达式仍然更短更快,这将涵盖 OP 中提到的所有情况。如果有什么不好的地方,请告诉我。
  • 如果您还想禁止前导 0 和尾随 . 您可以使用此表达式:^[+-]?(0|[1-9]\d{0,2}((\,\d{3})+|\d*))(\.\d+)?$ regex101.com/r/GPICKH/3
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
相关资源
最近更新 更多