正则expression式validation中的十进制或数字值

我正在尝试使用正则expression式validation来检查只有十进制值或数字值。 但用户input数字值,不是第一位数字“0”

我怎么做?

1-9范围内的数字,后跟零个或多个其他数字:

^[1-9]\d*$ 

允许带有可选小数点后面跟数字的数字。 1-9范围内的一个数字,后跟零个或多个其他数字,然后可以select后跟一个小数点,后跟至less一个数字:

 ^[1-9]\d*(\.\d+)?$ 

笔记:

  • 开始和结束的^$锚点基本上说整个string必须匹配模式

  • ()? 匹配括号内整个事物的0或1

更新来处理逗号:

在正则expression式中. 有一个特殊的含义 – 匹配任何单个字符。 从字面上匹配a . 在一个string中,你需要逃避 . 使用\. 这是\.的意思\. 在上面的正则expression式。 所以,如果你想使用逗号,而模式是简单的:

 ^[1-9]\d*(,\d+)?$ 

进一步更新来处理逗号和句号

如果你想允许一个 在数字组和小数部分之间,然后尝试:

 ^[1-9]\d{0,2}(\.\d{3})*(,\d+)?$ 

即这是1-9范围内的一个数字,然后是最多2个其他数字,然后是零个或多个完整的组,然后是3个数字,然后可选地,如前所述的逗号和数字。

如果你想允许一个 数字之间的任何地方然后尝试:

 ^[1-9][\.\d]*(,\d+)?$ 

即数字1-9,随后是零个或多个数字或满停止,可选地后跟一个逗号和一个或多个数字。

其实,没有一个给出的答案是完全覆盖的要求。
由于OP没有提供具体的使用案例或types的数字,我将尽力涵盖所有可能的案例和排列。

常规数字

整体积极

此数字通常称为无符号整数 ,但您也可以将其称为正数非小数数字,包括零。 这包括数字099999
涵盖此validation的正则expression式是:

 /^(0|[1-9]\d*)$/ 

testing这个正则expression式

整个正面和负面

这个数字通常被称为有符号整数 ,但也可以称之为非小数。 这包括像99999-99999-1-0
涵盖此validation的正则expression式是:

 /^-?(0|[1-9]\d*)$/ 

testing这个正则expression式

正如你可能注意到的,我还包括-0作为一个有效的数字。 但是,有些人可能会争论这个用法,并且说这不是一个真正的数字(你可以在这里阅读更多关于签名零)。 所以,如果你想从这个正则expression式中排除这个数字,下面是你应该使用的:

 /^-?(0|[1-9]\d*)(?<!-0)$/ 

testing这个正则expression式

我所添加的是(?<!-0) ,这意味着在这个断言之前不包括-0 。 这个(?<!...)断言称为否定倒序 ,这意味着任何短语replace...应该不会出现在这个断言之前。 逆向思维有其局限性,就像这个短语不能包含量词一样。 这就是为什么在某些情况下,我会使用Lookahead,而这是相同的,但方式相反。

许多正则expression式,包括Perl和Python使用的,只允许固定长度的string。 您可以使用文本文本,字符转义, \X以外的Unicode转义和字符类。 您不能使用量词或反向引用。 你可以使用交替,但只有当所有的select具有相同的长度。 这些风格评估lookbehind首先回顾主题string作为lookbehind需要尽可能多的字符,然后尝试从左到右的lookbehind里面的正则expression式。

你可以在这里阅读更多关于Lookaround断言。

分数

这个数字通常被称为unsigned floatunsigned double ,但是你也可以把它叫做正数分数,包括零。 这包括数字如99999.000001
涵盖此validation的正则expression式是:

 /^(0|[1-9]\d*)(\.\d+)?$/ 

testing这个正则expression式

有人可能会说,像.1.0.00651这样的数字(分别与0.006510.00651相同)也是有效的分数,我不能不同意。 所以这里是一个额外支持这种格式的正则expression式:

 /^(0|[1-9]\d*)?(\.\d+)?(?<=\d)$/ 

testing这个正则expression式

消极和积极

这个数字通常被称为签名浮点数或有符号双 精度数,但是您也可以称其为小数。 这包括数字如-99999.000001-0-1-0.0-0.1-99999.000001
涵盖此validation的正则expression式是:

 /^-?(0|[1-9]\d*)(\.\d+)?$/ 

testing这个正则expression式

对于非信徒:

 /^(?!-0(\.0+)?$)-?(0|[1-9]\d*)(\.\d+)?$/ 

testing这个正则expression式

对于那些想要支持不可见零表示的人,比如.1 ,-. .1 ,使用下面的正则expression式:

 /^-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)$/ 

testing这个正则expression式

-0信徒和不可见的零信徒的组合,使用这个正则expression式:

 /^(?!-0?(\.0+)?$)-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)$/ 

testing这个正则expression式

带有科学记数法的数字(AKA指数符号)

有些人可能会希望在他们的validation中支持,具有科学性的数字e ,这是一个绝对有效的数字,它被创build为短期代表一个非常长的数字。 你可以在这里阅读更多关于科学记数法。 这些数字通常看起来像1e31000 ), 1e-3 (0.001),并得到许多主要编程语言(如JavaScript)的全面支持。 您可以通过检查expression式'1e3'==1000返回true来testing它。
我将把所有上述部分的支持分开,包括用科学记数法编号。

常规数字

整数正数validation,支持像6e4 16e-10 0e0这样的数字,也支持像6e4一样的常规数字:

 /^(0|[1-9]\d*)(e-?(0|[1-9]\d*))?$/i 

testing这个正则expression式

整数正数和负数的正则expression式validation,支持像-6e4-16e-10-0e0这样的数字,还支持像-0-11这样的常规数字和上面所有的正整数:

 /^-?(0|[1-9]\d*)(e-?(0|[1-9]\d*))?$/i 

testing这个正则expression式

对于非-0信徒,整数正整数和负数的正则expression式validation,除了现在禁止像-0-0e0-0e5-0e-6

 /^(?!-0)-?(0|[1-9]\d*)(e-?(0|[1-9]\d*))?$/i 

testing这个正则expression式

分数

正数的正则expression式validation,也支持上面的整数,加上数字,如56.0e-3 0.0e101.010e0

 /^(0|[1-9]\d*)(\.\d+)?(e-?(0|[1-9]\d*))?$/i 

testing这个正则expression式

正数与不可见零支持正则expression式validation,还支持以上正数,另外还有数字如.0e-5.1e-7

 /^(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?$/i 

testing这个正则expression式

负数和正数的正则expression式validation,支持上面的正数,还有数字如-0e3-0.1e0-56.0e-3-0.0e10

 /^-?(0|[1-9]\d*)(\.\d+)?(e-?(0|[1-9]\d*))?$/i 

testing这个正则expression式

除了现在禁止-0-0.00000-0.0e0-0.00000e5-0e-6这样的数字之外,非-0信徒的正数和负数正则expression式-0.00000 -0.0e0

 /^(?!-0(\.0+)?(e|$))-?(0|[1-9]\d*)(\.\d+)?(e-?(0|[1-9]\d*))?$/i 

testing这个正则expression式

负数和正数用不可见的零支持正则expression式validation,还支持上面的正数和负数,另外还有数字如-.1e3 ,-. -.0e0 ,-. -.0e-5-.1e-7

 /^-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?$/i 

testing这个正则expression式

与非-0信徒和不可见零信徒组合的负数和正数,与上述相同,但禁止数字如-.0e0 ,-. -.0000e15-.0e-19

 /^(?!-0?(\.0+)?(e|$))-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?$/i 

testing这个正则expression式

带hex表示的数字

在许多编程语言中,像0x4F7A这样的hex数字的string表示可能很容易转换为十进制数字20346
因此,人们可能想要在他的validation脚本中支持它。
以下正则expression式仅支持hex数字表示forms:

 /^0x[0-9a-f]+$/i 

testing这个正则expression式

所有排列

这些最终的正则expression式支持不可见的零号码。

签署零信徒

 /^(-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?|0x[0-9a-f]+)$/i 

testing这个正则expression式

没有签署的零信徒

 /^((?!-0?(\.0+)?(e|$))-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?|0x[0-9a-f]+)$/i 

testing这个正则expression式

希望我涵盖了许多编程语言支持的所有数字排列。
祝你好运!


噢,忘了提到,那些想要validation数字的人包括一千个分隔符,你应该首先清除所有的逗号( , ),因为可能有任何types的分隔符,你实际上不能覆盖它们。
但是在数字validation之前,您可以先删除它们:

 //JavaScript function clearSeparators(number) { return number.replace(/,/g,''); } 

我有同样的问题,但我也希望“.25”是一个有效的十进制数。 这是我使用JavaScript的解决scheme:

 function isNumber(v) { // [0-9]* Zero or more digits between 0 and 9 (This allows .25 to be considered valid.) // ()? Matches 0 or 1 things in the parentheses. (Allows for an optional decimal point) // Decimal point escaped with \. // If a decimal point does exist, it must be followed by 1 or more digits [0-9] // \d and [0-9] are equivalent // ^ and $ anchor the endpoints so tthe whole string must match. return v.trim().length > 0 && v.trim().match(/^[0-9]*(\.[0-9]+)?$/); } 

我的trim()方法在哪里

 String.prototype.trim = function() { return this.replace(/(^\s*|\s*$)/g, ""); }; 

Matthew DesVoigne

我已经testing了所有给定的正则expression式,但不幸的是他们都没有通过这些testing:

  String []goodNums={"3","-3","0","0.0","1.0","0.1"}; String []badNums={"001","-00.2",".3","3.","a",""," ","-"," -1","--1","-.1","-0", "2..3", "2-", "2...3", "2.4.3", "5-6-7"}; 

这是我写的通过所有这些testing的最好的:

 "^(-?0[.]\\d+)$|^(-?[1-9]+\\d*([.]\\d+)?)$|^0$" 

在这里输入图像描述

这是一个伟大的数字工作正则expression式。 这接受逗号和小数的数字。

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

这是我的validation数字的正则expression式:

 ^(-?[1-9]+\\d*([.]\\d+)?)$|^(-?0[.]\\d*[1-9]+)$|^0$ 

有效的号码:

 String []validNumbers={"3","-3","0","0.0","1.0","0.1","0.0001","-555","94549870965"}; 

无效的号码:

 String []invalidNumbers={"a",""," ","-","001","-00.2","000.5",".3","3."," -1","--1","-.1","-0"}; 

如果您需要validation点,逗号,正数和负数的小数点,请尝试以下操作:

 Object testObject = "-1.5"; boolean isDecimal = Pattern.matches("^[\\+\\-]{0,1}[0-9]+[\\.\\,]{1}[0-9]+$", (CharSequence) testObject); 

祝你好运。

下面是提到的要求的完美之一:

 ^[0-9]{1,3}(,[0-9]{3})*(([\\.,]{1}[0-9]*)|())$ 

/([0-9]+[.,]*)+/与任何具有或不具有彗形像差或点的数字匹配

它可以匹配

  122 122,354 122.88 112,262,123.7678 

错误:它也匹配262.4377,3883(但它并不重要)

试试这个代码,希望它能帮助你

 String regex = "(\\d+)(\\.)?(\\d+)?"; for integer and decimal like 232 232.12