正则表达式匹配数字和小数

时间:2012-06-06 19:43:18

标签: regex

我需要一个与以下内容匹配的正则表达式:

.5
0.5
1.5
1234

但不是

0.5.5
absnd (any letter character or space)

我有这个满足除0.5.5

以外的所有内容
^[.?\d]+$

5 个答案:

答案 0 :(得分:21)

这是一项相当普遍的任务。我知道处理它的最简单方法是:

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

还有其他一些并发症,例如是否要允许前导零或逗号或类似的东西。这可能会像你想要的那样复杂。例如,如果要允许1,234,567.89格式,可以使用:

^[+-]?(\d*|\d{1,3}(,\d{3})*)(\.\d+)?\b$

\b有一个单词中断,但是我用它作为一种偷偷摸摸的方式,要求在字符串的末尾至少有一个数字。这样,空字符串或单个+将不匹配。

但是,请注意正则表达式不是解析数字字符串的理想方法。我所知道的所有现代编程语言都有快速,简单的内置方法。

答案 1 :(得分:10)

似乎没有人会对负数进行说明。此外,有些人正在创建一个不必要的捕获组。这是IMO最彻底的解决方案。

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

编辑:为什么选择downvote?

答案 2 :(得分:6)

这是一个更简单的解决方案,不使用任何先行或后视:

^\d*\.?\d+$

要清楚地了解其原因,请从右到左阅读:

  • 最后至少需要一位数字。
    7有效
    77有效
    .77有效
    0.77有效
    0.不起作用
    空字符串不起作用
  • 数字前面的单个句点是可选的。
    .77有效
    77有效
    ..77不起作用
  • (可选)期间之前的任意位数。 .77有效
    0.77有效
    0077.77有效
    0077正常工作

不使用预见和后视还有一个额外的好处,就是不必担心基于RegEx的DOS攻击。

HTH

答案 3 :(得分:3)

以下内容应该有效:

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

这使用负前瞻来确保字符串中的.个字符少于两个。

http://www.rubular.com/r/N3jl1ifJDX

答案 4 :(得分:1)

这可行:

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