139

我需要一个验证数字的正则表达式,但不需要小数点后的数字。IE。

123
123.
123.4

都是有效的

123..

将是无效的

任何将不胜感激!

4

16 回答 16

228

使用以下内容:

/^\d*\.?\d*$/
  • ^- 行首;
  • \d*- 0 个或多个数字;
  • \.?- 一个可选的点(转义,因为在正则表达式中,.是一个特殊字符);
  • \d*- 0 位或更多位(小数部分);
  • $- 队伍的尽头。

这允许 0.5 小数,而不需要前导零,例如 0.5

于 2012-08-24T21:43:44.617 回答
138
/\d+\.?\d*/

一位或多位数字 ( \d+)、可选句点 ( \.?)、零位或多位数字 ( \d*)。

根据您的使用情况或正则表达式引擎,您可能需要添加开始/结束行锚点:

/^\d+\.?\d*$/

正则表达式可视化

调试演示

于 2012-08-24T21:43:41.667 回答
90

你需要一个像下面这样的正则表达式才能正确地做到这一点:

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

带有空格的相同表达式,使用扩展修饰符(Perl 支持):

/^  [+-]? ( (\d+ (\.\d*)?)  |  (\.\d+) ) $/x

或评论:

/^           # Beginning of string
 [+-]?       # Optional plus or minus character
 (           # Followed by either:
   (           #   Start of first option
     \d+       #   One or more digits
     (\.\d*)?  #   Optionally followed by: one decimal point and zero or more digits
   )           #   End of first option
   |           # or
   (\.\d+)     #   One decimal point followed by one or more digits
 )           # End of grouping of the OR options
 $           # End of string (i.e. no extra characters remaining)
 /x          # Extended modifier (allows whitespace & comments in regular expression)

例如,它将匹配:

  • 123
  • 23.45
  • 34.
  • .45
  • -123
  • -273.15
  • -42。
  • -.45
  • +516
  • +9.8
  • +2。
  • +.5

并将拒绝这些非数字:

  • . (一个小数点)
  • -。(负小数点)
  • +。(加上小数点)
  • (空字符串)

更简单的解决方案可能会错误地拒绝有效数字或匹配这些非数字。

于 2014-05-26T14:10:18.450 回答
21

这符合所有要求:

^\d+(\.\d+)?$
于 2013-09-05T11:11:33.743 回答
17

试试这个正则表达式:

\d+\.?\d*

\d+ 可选小数之前的数字
.? 可选小数(可选由于 ? 量词)
\d* 小数后可选数字

于 2012-08-24T21:43:33.820 回答
7

我最终使用了以下内容:

^\d*\.?\d+$

这使得以下内容无效:

.
3.
于 2015-02-11T22:24:11.377 回答
5

你可以使用这个:

^\d+(\.\d)?\d*$

比赛:
11
11.1
0.2

不匹配:
.2
2.
2.6.9

于 2018-11-06T09:45:03.457 回答
3
^[+-]?(([1-9][0-9]*)?[0-9](\.[0-9]*)?|\.[0-9]+)$

应该反映人们通常认为的格式良好的十进制数。

小数点前的数字可以是单个数字,在这种情况下可以是 0 到 9,也可以是多个数字,这种情况下不能以 0 开头。

如果小数点符号前有任何数字,则小数点及其后面的数字是可选的。否则,必须存在小数点后跟至少一位数字。请注意,小数点后允许有多个尾随 0。

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

正确匹配以下内容:

9
0
10
10.
0.
0.0
0.100
0.10
0.01
10.0
10.10
.0
.1
.00
.100
.001

以及它们的签名等价物,而它拒绝以下内容:

.
00
01
00.0
01.3

及其签名的等价物,以及空字符串。

于 2019-10-08T06:33:36.500 回答
3

这就是我所做的。它比上述任何一个都更严格(并且比某些更正确):

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

通过的字符串:

0
0.
1
123
123.
123.4
.0
.0123
.123
0.123
1.234
12.34

失败的字符串:

.
00000
01
.0.
..
00.123
02.134
于 2016-02-07T21:27:31.980 回答
2

什么语言?在 Perl 风格中:^\d+(\.\d*)?$

于 2012-08-24T21:50:21.847 回答
2

您所问的问题已经得到解答,因此如果输入可选小数点,这只是对于那些只想要 2 个小数位的人的附加信息:

^\d+(\.\d{2})?$

^ : 字符串的开头
\d : 一个数字 (等于 [0-9])
+ : 一次和无限次

正在捕获组 (.\d{2})?
? : 零次和一次。: 特点 。
\d : 一个数字 (等于 [0-9])
{2} : 正好是 2 倍
$ : 字符串结尾

1:匹配
123:匹配
123.00:匹配
123.:不匹配
123..:不匹配
123.0:不匹配
123.000:不匹配
123.00.00:不匹配

于 2019-06-26T15:44:02.620 回答
1
(?<![^d])\d+(?:\.\d+)?(?![^d])

干净简单。

这使用了后缀和前缀、RegEx 功能。

对于 IsMatch 条件,它直接返回 true - false

于 2014-03-21T10:50:09.450 回答
1
^\d+(()|(\.\d+)?)$

想出了这个。允许整数和小数,但如果您决定输入小数,则强制使用完整的小数(前导和尾随数字)。

于 2015-02-12T10:12:35.403 回答
1

尝试这个。^[0-9]\d{0,9}(\.\d{1,3})?%?$它经过测试并为我工作。

于 2020-02-04T19:32:04.200 回答
1

正则表达式:

^\d+((.)|(.\d{0,1})?)$

如果您想允许多于一个数字,请使用而不是\d+如果您想在昏迷后最多允许两个数字,请使用而不是。请参阅下面的示例以供参考:\d{0,1}\d{0,2}\d{0,1}

在此处输入图像描述

或者

^\d+((.)|(.\d{0,2})?)$

在此处输入图像描述

或者

^\d+((.)|(.\d+)?)$

在此处输入图像描述

解释

`^` 断言行首的位置
`\d` 匹配一个数字(相当于 `[0-9]`)
`+` 匹配前一个标记一次到无限次,尽可能多次,返回为需要(贪婪)
第一个捕获组 `((.)|(.\d{0,1})?)`
第一个替代 `(.)`
第二个捕获组 `(.)`
`.` 匹配任何字符(除了行终止符)
2nd Alternative `(.\d{0,1})?`
3rd Capturing Group `(.\d{0,1})?`
`?` 匹配前一个标记 0 到 1 次,多次尽可能根据需要返回(贪婪)
`.` 匹配任何字符(行终止符除外)
`\d` 匹配数字(相当于 [0-9])
`{0,1}` 匹配前一个标记 0 到 1 次,尽可能多次,根据需要返回(贪婪)
`$` 在行尾断言位置

沙盒

在这里玩正则表达式:https ://regex101.com/

于 2021-09-09T03:17:33.610 回答
0

在 Perl 中,使用 Regexp::Common 可以为您的特定数字格式组装一个经过微调的正则表达式。如果您不使用 Perl,生成的正则表达式通常仍然可以被其他语言使用。

打印在 Regexp::Common::Number 中生成示例正则表达式的结果:

$ perl -MRegexp::Common=number -E 'say $RE{num}{int}'
(?:(?:[-+]?)(?:[0123456789]+))

$ perl -MRegexp::Common=number -E 'say $RE{num}{real}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789])(?:[0123456789]*)(?:(?:[.])(?:[0123456789]{0,}))?)(?:(?:[E])(?:(?:[-+]?)(?:[0123456789]+))|))

$ perl -MRegexp::Common=number -E 'say $RE{num}{real}{-base=>16}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789ABCDEF])(?:[0123456789ABCDEF]*)(?:(?:[.])(?:[0123456789ABCDEF]{0,}))?)(?:(?:[G])(?:(?:[-+]?)(?:[0123456789ABCDEF]+))|))
于 2013-09-05T12:08:07.207 回答