我需要使用小数点分隔符和千位分隔符来验证数字是否有效。我需要一个正则表达式,因为当前代码(不是我自己完成的)使用的正则表达式无法正常工作,我的目标是修复它。
因此以下组合是合法的(使用.
作为小数分隔符,,
作为千位分隔符)
但是以下内容不合法:
基本上我希望数字能正确使用小数和千位分隔符,或者根本不使用数字,但不是无效的组合。 我四处张望,到目前为止,我发现了this post。 Wich有一个很棒的正则表达式,当数字具有小数点分隔符和千位分隔符时,它可以完美匹配,但是当我尝试添加其他选项(仅带小数点分隔符的数字或数字整数)时,我会破坏表达式。
我决定也许我可以用或捕获与规则匹配的组,因此数字可以像这样匹配一个表达式或另一个表达式:
^([+-]?[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 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失败答案 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+
->匹配不带小数点分隔符的数字$
->字符串结尾答案 1 :(得分:3)
您可以使用此正则表达式进行验证:
^[+-]?(?:\d+|\d{1,3}(?:,\d{3})*)(?:\.\d*)?$
它匹配以下情况:
,
的数字