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

时间:2010-05-11 13:24:31

标签: regex validation

我正在尝试使用正则表达式验证来仅检查十进制值或数值。但是用户输入数值,它不是第一个数字“0”

我该怎么做?

12 个答案:

答案 0 :(得分:113)

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

^[1-9]\d*$

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

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

备注:

  • 开始和结束的^$锚定基本上说整个字符串必须与模式匹配

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

处理逗号的更新:

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

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

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

如果您想在数字组之间允许,在积分和小数部分之间允许,请尝试:

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

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

如果您想在数字之间的任何位置允许,请尝试:

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

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

答案 1 :(得分:64)

实际上,没有一个给定的答案完全覆盖了请求 由于OP没有提供特定用例或数字类型,我将尝试涵盖所有可能的案例和排列。

常规号码

全面积极

此数字通常称为无符号整数,但您也可以将其称为正非小数,包括零。其中包括0199999等数字 涵盖此验证的正则表达式是:

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

Test This Regex

整体正面和负面

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

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

Test This Regex

正如您可能已经注意到的那样,我还将-0作为有效数字。但是,有些人可能会争论这种用法,并告诉这不是一个实数(你可以阅读更多关于签名零here)。所以,如果你想从这个正则表达式中排除这个数字,那么你应该使用的是:

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

Test This Regex

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

  

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

您可以阅读更多回合查找断言here

分数

此数字通常称为 unsigned float unsigned double ,但您也可以将其称为正小数,包括零。其中包括010.00.11.099999.0000015.10等数字。 涵盖此验证的正则表达式是:

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

Test This Regex

有些人可能会说,.1.0.00651(分别与0.10.00.00651相同)也是有效的分数,我不能不同意它们。所以这里有一个正则表达式,它还支持这种格式:

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

Test This Regex

否定和正面

此号码通常称为 signed float signed double ,但您也可以将其称为小数。其中包括010.00.11.099999.0000015.10,{{1}等数字},-0-1-0.0-0.1-99999.000001
涵盖此验证的正则表达式是:

5.10

Test This Regex

对于非/^-?(0|[1-9]\d*)(\.\d+)?$/ 信徒:

-0

Test This Regex

对于那些想要支持隐身零表示的人,例如/^(?!-0(\.0+)?$)-?(0|[1-9]\d*)(\.\d+)?$/ .1,请使用以下正则表达式:

-.1

Test This Regex

/^-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)$/ 信徒和看不见的零信徒的组合,使用这个正则表达式:

-0

Test This Regex

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

有些人可能希望在他们的验证中支持具有科学字符/^(?!-0?(\.0+)?$)-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)$/ 的数字,顺便说一下,这是一个绝对有效的数字,它很快就代表了很长的数字。您可以阅读有关科学记数法here的更多信息。这些数字通常看起来像e1e3),1000(0.001),并且得到许多主要编程语言(例如JavaScript)的完全支持。您可以通过检查表达式1e-3是否返回'1e3'==1000来测试它 我将分配对上述所有部分的支持,包括带有科学记数法的数字。

常规号码

完整正数正则表达式验证,支持true6e416e-10等数字,但也包括0e00等常规数字:

11

Test This Regex

完整的正面和负面数字正则表达式验证,支持/^(0|[1-9]\d*)(e-?(0|[1-9]\d*))?$/i -6e4-16e-10等数字,但也包括常规数字,如-0e0-0和所有以上全部正数:

-11

Test This Regex

/^-?(0|[1-9]\d*)(e-?(0|[1-9]\d*))?$/i 信徒的正面和负面正则数字验证,与上述情况相同,但现在它禁止使用-0-0-0e0和{{ 1}}:

-0e5

Test This Regex

分数

正数正则表达式验证,也支持上面的整数,加上-0e-6/^(?!-0)-?(0|[1-9]\d*)(e-?(0|[1-9]\d*))?$/i 0.1e356.0e-3等数字:

0.0e10

Test This Regex

带有隐形零支持正则表达式验证的正数,还支持上述正数,此外还有1.010e0/^(0|[1-9]\d*)(\.\d+)?(e-?(0|[1-9]\d*))?$/i .1e3.0e0等数字:

.0e-5

Test This Regex

正数和正数的正则表达式验证,支持上面的正数,但也支持.1e-7/^(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?$/i -0e3-0.1e0等数字:

-56.0e-3

Test This Regex

-0.0e10信徒的正数和正数正则数确认,与上述相同,但现在它禁止/^-?(0|[1-9]\d*)(\.\d+)?(e-?(0|[1-9]\d*))?$/i -0-0,{{1 }和-0.00000

-0.0e0

Test This Regex

带有隐形零支持正则表达式验证的负数和正数,还支持上述正数和负数,此外还包括-0.00000e5-0e-6/^(?!-0(\.0+)?(e|$))-?(0|[1-9]\d*)(\.\d+)?(e-?(0|[1-9]\d*))?$/i -.1e3等数字:

-.0e0

Test This Regex

-.0e-5信徒和无形零信徒的组合的负数和正数,与上述相同,但禁止-.1e-7/^-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?$/i -0等数字:

-.0e0

Test This Regex

具有十六进制表示的数字

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

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

Test This Regex

所有排列

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

签约零信徒

0x4F7A

Test This Regex

无签名的零信徒

20346

Test This Regex

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

哦,忘了提一下,那些想要验证数字的人包括一千个分隔符,你应该首先清除所有的逗号(/^0x[0-9a-f]+$/i ),因为那里可能有任何类型的分隔符,你可以&实际上涵盖了所有这些 但您可以在数字验证之前先删除它们:

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

答案 2 :(得分:7)

我遇到了同样的问题,但我也希望“.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]+)?$/);
}

我的trim()方法是

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

Matthew DesVoigne

答案 3 :(得分: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"};

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

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

enter image description here

答案 4 :(得分:2)

这是一个很好的数字工作正则表达式。这接受带逗号和小数的数字。

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

答案 5 :(得分:1)

以下是验证数字的正则表达式:

^(-?[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"};

答案 6 :(得分:1)

/([0-9]+[.,]*)+/匹配任何带或不带昏迷或点数的数字

它可以匹配

         122
         122,354
         122.88
         112,262,123.7678

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

答案 7 :(得分:1)

试试这段代码,希望它能帮到你

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

答案 8 :(得分:1)

一个简单的正则表达式来匹配数字输入和可选的 2 位小数。

/^\d*(\.)?(\d{0,2})?$/

您可以修改 {0,2} 以匹配您的小数首选项 {min, max}


验证片段:

const source = document.getElementById('source');
source.addEventListener('input', allowOnlyNumberAndDecimals);

function allowOnlyNumberAndDecimals(e) {
  let str = e.target.value
  const regExp = /^\d*(\.)?(\d{0,2})?$/

  status = regExp.test(str) ? 'valid' : 'invalid'

  console.log(status + ' : ' + source.value)
}
<input type="text" id="source" />

答案 9 :(得分:0)

如果你需要用点,逗号,正数和负数来验证小数,请尝试:

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

答案 10 :(得分:0)

以下是上述要求的完美之处:

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

答案 11 :(得分:-2)

正则表达式 ^(\d+(\.\d+)?)$ 适用于每个数字。 为了演示,我将它嵌入到一个可运行的 JS-fiddle 中:

const source = document.getElementById('source');
source.addEventListener('input', allowOnlyNumberAndDecimals);

function allowOnlyNumberAndDecimals(e) {
  let str = e.target.value
  const regExp = /^(\d+(\.\d+)?)$/

  let status = regExp.test(str) ? 'valid' : 'invalid'

  console.log(status + ' : ' + source.value)
}
body {
  height: 100vh;
  background: pink;
  color: black;
  justify-content: center;
  align-items: center;
}
<h1>VALIDATE ALL NUMBERS :)<h1>
<input type="text" id="source" />