正则表达式验证中的十进制或数值

ilk*_*drl 53 regex validation

我试图使用正则表达式验证来检查只有十进制值或数值.但是用户输入数值,它不是第一个数字"0"

我怎么做?

mik*_*kej 119

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

^[1-9]\d*$
Run Code Online (Sandbox Code Playgroud)

允许带有可选小数点后跟数字的数字.1-9范围内的数字,后跟零个或多个其他数字,然后可选地后跟一个小数点,后跟至少1位数字:

^[1-9]\d*(\.\d+)?$
Run Code Online (Sandbox Code Playgroud)

笔记:

  • ^$锚的起点和终点基本上是说,整个字符串必须匹配模式

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

处理逗号的更新:

正则表达式.具有特殊含义 - 匹配任何单个字符.按字面匹配.的,你需要一个字符串逃过.使用\.这其中的含义\.在上述正则表达式.因此,如果您想使用逗号,则模式只是:

^[1-9]\d*(,\d+)?$
Run Code Online (Sandbox Code Playgroud)

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

如果你想允许一个.组数字和之间,之间的积分和小数部分再试试:

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

即,这是1-9范围内的数字,后跟最多2个其他数字,然后是0或更多组完整停止,后跟3位数字,然后可选地使用逗号和数字.

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

^[1-9][\.\d]*(,\d+)?$
Run Code Online (Sandbox Code Playgroud)

即数字1-9后跟零个或多个数字或句号,可选地后跟逗号和一个或多个数字.

  • 如果零是有效数字,则使`^([1-9]\d*| 0)$`. (3认同)
  • @ArshabhAgarwal原来的问题要求_it不要是第一个数字"0"_所以0.11不匹配.如果你认为这意味着没有不必要的前导零,但数字可以是0本身或0后跟一个小数部分,那么你可以添加一个案例来处理这个例如`^([1-9]\d*| 0)( \.\ d +)?$` (2认同)

Sla*_*ser 72

实际上,没有给出的答案完全涵盖了请求.
由于OP没有提供具体的用例或数字类型,我将尝试涵盖所有可能的案例和排列.

常规号码

整体积极

此数字通常称为无符号整数,但您也可以将其称为正非小数,包括零.这包括相同的数字0,199999.
涵盖此验证的正则表达式是:

/^(0|[1-9]\d*)$/
Run Code Online (Sandbox Code Playgroud)

测试这个正则表达式

整体正面和负面

此数字通常称为有符号整数,但您也可以将其称为非小数.这包括数字一样0,1,99999,-99999,-1-0.
涵盖此验证的正则表达式是:

/^-?(0|[1-9]\d*)$/
Run Code Online (Sandbox Code Playgroud)

测试这个正则表达式

你可能已经注意到了,我也把它-0作为一个有效数字.但是,有些人可能会争论这种用法,并告诉这不是一个实数(你可以在这里阅读更多关于签名零).所以,如果你想从这个正则表达式中排除这个数字,那么你应该使用以下内容:

/^-?(0|[1-9]\d*)(?<!-0)$/
Run Code Online (Sandbox Code Playgroud)

测试这个正则表达式

我添加的全部是(?<!-0),这意味着-0在此断言之前不要包括.这个(?<!...)断言称为负后观,这意味着任何短语...都不应该在此断言之前出现.Lookbehind有局限性,就像短语不能包括量词.这就是为什么在某些情况下我会使用Lookahead,这是相同的,但是相反的方式.

许多正则表达式的风格,包括Perl和Python使用的风格,只允许固定长度的字符串.您可以使用文字文本,字符转义,Unicode转义\X以及字符类.您不能使用量词或反向引用.您可以使用交替,但仅当所有替代方案具有相同的长度时.这些风格通过首先回溯主题字符串以获得与lookbehind需求一样多的字符来评估lookbehind,然后从左到右尝试在lookbehind内部的正则表达式.

您可以在此处阅读更多回合Lookaround断言.

分数

这个数字通常称为无符号浮点数无符号双精度数,但您也可以将其称为正小数,包括零.这包括相同的数字0,1,0.0,0.1,1.0,99999.000001,5.10.
涵盖此验证的正则表达式是:

/^(0|[1-9]\d*)(\.\d+)?$/
Run Code Online (Sandbox Code Playgroud)

测试这个正则表达式

可能有人会说,那个号码,如.1,.0.00651(同0.1,0.00.00651分别)也是有效的小数,我不能跟他们不同意.所以这是一个正则表达式,另外支持这种格式:

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

测试这个正则表达式

消极和积极的

此数字通常称为有符号浮点数或有符号双精度数,但您也可以将其称为小数.这包括相同的数字0,1,0.0,0.1,1.0,99999.000001,5.10,-0,-1,-0.0,-0.1,-99999.000001,5.10.
涵盖此验证的正则表达式是:

/^-?(0|[1-9]\d*)(\.\d+)?$/
Run Code Online (Sandbox Code Playgroud)

测试这个正则表达式

对于非-0信徒:

/^(?!-0(\.0+)?$)-?(0|[1-9]\d*)(\.\d+)?$/
Run Code Online (Sandbox Code Playgroud)

测试这个正则表达式

对于那些谁想要更是无形零个表示支持,比如.1,-.1使用以下正则表达式:

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

测试这个正则表达式

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

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

测试这个正则表达式

带有科学记数法的数字(AKA指数表示法)

有些人可能希望在他们的验证中支持,具有科学特征的数字,e顺便说一句,这是一个绝对有效的数字,它很快就代表了很长的数字.你可以阅读更多关于科学记数法在这里.这些数字通常看起来像1e3(是1000),1e-3(0.001),并且得到许多主要编程语言(例如JavaScript)的完全支持.您可以通过检查表达式是否'1e3'==1000返回来测试它true.
我将分配对上述所有部分的支持,包括带有科学记数法的数字.

常规号码

全正数的正则表达式验证,支持相同的数字6e4,16e-10,0e0还要定期号码,如0,11:

/^(0|[1-9]\d*)(e-?(0|[1-9]\d*))?$/i
Run Code Online (Sandbox Code Playgroud)

测试这个正则表达式

整个正面和负面的数量正则表达式验证,支持数字一样-6e4,-16e-10,-0e0还要定期号码一样-0,-11而最全的正数:

/^-?(0|[1-9]\d*)(e-?(0|[1-9]\d*))?$/i
Run Code Online (Sandbox Code Playgroud)

测试这个正则表达式

整个正和负号的正则表达式的验证对于非-0信,与上述相同,除了现在它禁止号码等-0,-0e0,-0e5-0e-6:

/^(?!-0)-?(0|[1-9]\d*)(e-?(0|[1-9]\d*))?$/i
Run Code Online (Sandbox Code Playgroud)

测试这个正则表达式

分数

正数的正则表达式验证,上述整数也支持,再加上号码,如0.1e3,56.0e-3,0.0e101.010e0:

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

测试这个正则表达式

隐形零支持正则表达式验证正数,也支持上述正数,除了号码,如.1e3,.0e0,.0e-5.1e-7:

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

测试这个正则表达式

正,负号正则表达式验证,支持上述的正数,而且数量一样-0e3,-0.1e0,-56.0e-3-0.0e10:

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

测试这个正则表达式

正,负号的正则表达式验证来回非-0信徒,与上述相同,只是现在它禁止号码,如-0,-0.00000,-0.0e0,-0.00000e5-0e-6:

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

测试这个正则表达式

隐形零支持正则表达式验证负和正数,也支持上述正数和负数,除了号码,如-.1e3,-.0e0,-.0e-5-.1e-7:

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

测试这个正则表达式

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

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

测试这个正则表达式

十六进制表示的数字

在许多编程语言中,十六进制数字的字符串表示0x4F7A可以很容易地转换为十进制数20346.
因此,人们可能希望在他的验证脚本中支持它.
以下正则表达式仅支持十六进制数字表示:

/^0x[0-9a-f]+$/i
Run Code Online (Sandbox Code Playgroud)

测试这个正则表达式

所有排列

这些最终的正则表达式,支持无形的零数字.

签约零信徒

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

测试这个正则表达式

无签名的零信徒

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

测试这个正则表达式

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


哦,忘了提一下,那些想要验证数字的人包括一千个分隔符,你应该首先清理所有的逗号(,),因为那里可能有任何类型的分隔符,你实际上无法覆盖它们.
但您可以在数字验证之前先删除它们:

//JavaScript
function clearSeparators(number)
{
    return number.replace(/,/g,'');
}
Run Code Online (Sandbox Code Playgroud)

  • 这是我见过的最过分完整的答案之一,而且充其量只是针对一个质量可疑的问题。我喜欢它!:D (4认同)
  • 这是一篇研究文章!确实是关于SO主题的最佳答案。仅在所有小组开始时我都使用?:。 (2认同)

小智 8

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

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]+)?$/);
}
Run Code Online (Sandbox Code Playgroud)

我的trim()方法是什么

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

Matthew DesVoigne


Nik*_*tin 6

我已经测试了所有给定的正则表达式但不幸的是没有一个通过这些测试:

    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"};
Run Code Online (Sandbox Code Playgroud)

这是我写的最好的,通过所有这些测试:

"^(-?0[.]\\d+)$|^(-?[1-9]+\\d*([.]\\d+)?)$|^0$"
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 到目前为止,你的是最好的,但它也失败如下:a < - c("2..3","2-","2 ... 3","2.4.3","5-6 -7")你有解决方案吗? (2认同)
  • 感谢您的粘贴,更容易理解这个问题.所以要修复它或换句话说也要匹配Perl(如你的情况)只需添加开始|结束标记以使引擎理解每个组应该单独行动.它使正则表达式更长4个字符,但也为你解决问题. (2认同)