十进制数正则表达式,其中十进制数字是可选的

时间:2012-08-24 21:40:24

标签: regex

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

123
123.
123.4

一切都有效

123..

无效

任何人都将不胜感激!

15 个答案:

答案 0 :(得分:159)

使用以下内容:

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

这允许.5十进制而不是要求前导零,例如0.5

答案 1 :(得分:97)

/\d+\.?\d*/

一个或多个数字(\d+),可选期间(\.?),零个或多个数字(\d*)。

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

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

Regular expression visualization

Debuggex Demo

答案 2 :(得分:62)

您需要使用如下正则表达式来正确执行此操作:

/^[+-]?((\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
  • 0.45
  • -123
  • -273.15
  • -42。
  • - 45
  • 516
  • 9.8
  • 2
  • +。5

并将拒绝这些非数字:

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

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

答案 3 :(得分:7)

试试这个正则表达式:

\d+\.?\d*
  

\ d +可选小数前的数字
  。?可选小数(由于?量词可选)
  \ d *十进制后的可选数字

答案 4 :(得分:4)

我最终使用了以下内容:

^\d*\.?\d+$

这使得以下内容无效:

.
3.

答案 5 :(得分:3)

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

答案 6 :(得分:3)

我认为这是最好的(符合所有要求): ^ \ d +(\。\ d +)?$

答案 7 :(得分:2)

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

^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

答案 8 :(得分:1)

(?<![^d])\d+(?:\.\d+)?(?![^d])

简洁明了。

这使用后缀和前缀,RegEx功能。

它直接返回true - IsMatch条件的错误

答案 9 :(得分:1)

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

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

答案 10 :(得分:1)

您可以使用此:

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

匹配项:
11
11.1
0.2

不匹配:
.2
2.
2.6.9

答案 11 :(得分:1)

^[+-]?(([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

及其带符号的等价物以及空字符串。

答案 12 :(得分: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]+))|))

答案 13 :(得分:0)

您的要求已经得到回答,因此对于那些只需要输入两位小数(如果输入了可选的小数点)的人来说,这只是一个附加信息:

^\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:不匹配

答案 14 :(得分:0)

尝试一下。 ^[0-9]\d{0,9}(\.\d{1,3})?%?$已通过测试并为我工作。