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

标签 regex

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

  • 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而不是
  • 失败
  • ^-?(?!0)(?:\d+|\d{1,3}(?:\.\d{3})+)$->对于-100.03失败
  • 最佳答案

    第二种选择不匹配的原因是,它仅允许小数点后的单个\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

    关于regex - 正则表达式匹配带小数分隔符和可选千位分隔符的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53822997/

    相关文章:

    java - 自定义时间字符串的正则表达式

    javascript - 突出显示匹配的文本并区分大小写以进行自动建议

    c# - 此正则表达式替换如何反转字符串?

    php - 我如何使用 php 检测字符串中的 iso8859-8 和 utf8 希伯来字符

    sql - 将各种类似日期的字符串 (varchar) 转换为一个 DATE 字段

    python - 在 Python 中验证名称

    sql - 正则表达式中 (*) 和 .* 有什么区别?

    python - 在python中提取嵌套正则表达式的所有匹配项

    javascript - 在 Javascript 中验证用户的 UTF-8 名称

    python - 基于正则表达式过滤数据框