正则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的数字,我将尽力涵盖所有可能的案例和排列。
常规数字
整体积极
此数字通常称为无符号整数 ,但您也可以将其称为正数非小数数字,包括零。 这包括数字0
和99999
。
涵盖此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 float或unsigned double ,但是你也可以把它叫做正数分数,包括零。 这包括数字如99999.000001
。
涵盖此validation的正则expression式是:
/^(0|[1-9]\d*)(\.\d+)?$/
testing这个正则expression式
有人可能会说,像.1
, .0
和.00651
这样的数字(分别与0.00651
和0.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为短期代表一个非常长的数字。 你可以在这里阅读更多关于科学记数法。 这些数字通常看起来像1e3
( 1000
), 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.0e10
和1.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