我需要使用小数点分隔符和可选的千位分隔符来验证数字是否有效。我需要一个正则表达式,因为当前的代码(不是我自己完成的)使用了无法正常工作的正则表达式,我的目标是修复它。
因此,以下组合将是合法的(使用.
作为小数点分隔符,并使用,
作为千位分隔符)
但是以下内容不合法:
基本上,我希望数字使用正确使用小数和千位分隔符或完全不使用数字,而不是无效的组合。
我环顾了四周,到目前为止,我找到了this post。当数字具有小数点分隔符和千位分隔符时,它具有很好的正则表达式,可以完美匹配,但是当我尝试添加其他选项(仅带小数点分隔符的数字或数字整数)时,我会破坏表达式。
我决定也许可以用或捕获匹配规则的组,因此数字可以匹配一个表达式或另一个表达式,如下所示:
^([+-]?[0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?)|(((\d)*)+?(\.\d))|(\d*)$
第一组是另一篇文章中的表达式,第二组是用小数点分隔符表示的数字,最后一组是整数,但它不起作用。例如,这些数字不匹配:
我认为这是正在发生的问题,因为它总是测试第一个组,但是我不确定如何正确使用这些组,以使其与它们中的任何一个都匹配。另外,我认为我将-+号放置在错误的位置。
我做了很多搜索,却找不到一个能正常工作的表达式。从建议的那些:
来自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/