正则表达式匹配带或不带前导零的小数

时间:2009-09-07 10:33:43

标签: regex

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

我不太了解正则表达。 上面的正则表达式不允许输入.2。但它允许所有其他小数,如0.2,0.02等。我需要让这个表达式允许数字,如.2,.06等......

5 个答案:

答案 0 :(得分:10)

只需将+之后的[0]更改为ansterisk` *“:

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

因此,不要在点之前允许一个或多个零,只允许0或更多。

答案 1 :(得分:8)

我喜欢这个浮点数的正则表达式,它非常聪明,因为它不会将0.0与数字匹配。它要求在期间的任何一侧至少有一个非零数字。想想我会把它分解成各个部分,以便更深入地理解它。

^             #Match at start of string
 (            #start capture group
  [0-9]*       # 0-9, zero or more times
  [1-9]        # 1-9
  [0-9]*       # 0-9, zero or more times
  (            #start capture group
   \.           # literal .
   [0-9]+       # 0-9, one or more times
  )?           #end group - make it optional
 |            #OR - If the first option didn't match, try alternate
  [0]+         # 0, one or more times ( change this to 0* for zero or more times )
  \.           # literal .
  [0-9]*       # 0-9, zero or more times
  [1-9]        # 1-9
  [0-9]*       # 0-9, zero or more times
 )            #end capture group
$             #match end of string

正则表达式在其中有两个较小的模式,第一个匹配数字> = 1的情况(具有至少一个非零字符。)可选地允许具有一个或多个尾随数字的句点。第二个匹配< 1.0并确保点右侧至少有一个非零数字。

Johannes的回答已经为您提供了问题的[0]*解决方案。

一些正则表达式快捷方式,您可以在大多数正则表达式风格中用[0-9]替换\d的任何实例。此外[0]仅匹配0,因此您也可以使用0*代替[0]*。最终的正则表达式:

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

答案 2 :(得分:2)

我会用这个:

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

这允许以

开头的数字表达式
  • 一些数字,后跟可选的小数位,或
  • 只是小数位数。

允许:

123
123.
123.45
.12345

但不是:

.
01234

答案 3 :(得分:1)

您也可以使用简单的表达式:

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

答案 4 :(得分:0)

将其替换为:

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

甚至更短:

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