14

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

.5
0.5
1.5
1234

但不是

0.5.5
absnd (any letter character or space)

我有这个满足所有但0.5.5

^[.?\d]+$
4

5 回答 5

33

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

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

还有其他复杂性,例如您是否要允许前导零或逗号或类似的东西。这可以像您希望的那样复杂。例如,如果你想允许 1,234,567.89 格式,你可以这样做:

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

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

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

于 2012-06-06T19:48:15.953 回答
13

这是一个更简单的解决方案,它不使用任何前瞻或后瞻:

^\d*\.?\d+$

要清楚地理解为什么会这样,请从右到左阅读:

  • 最后至少需要一位数字。
    7有效
    77有效
    .77有效
    0.77无效 空字符串
    0.无效

  • 数字前的单个句点是可选的。
    .77有效
    77有效
    ..77无效
  • (可选)句点之前的任意位数。 .77作品
    0.77作品
    0077.77作品作品
    0077作品

不使用前瞻和后瞻的额外好处是不必担心基于 RegEx 的 DOS 攻击。

高温高压

于 2016-12-14T17:24:27.020 回答
12

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

^[+-]?(?:\d*\.)?\d+$
于 2012-06-06T19:50:43.677 回答
3

以下应该有效:

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

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

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

于 2012-06-06T19:48:19.913 回答
1

这可以工作:

^(?:\d*\.)?\d+$
于 2012-06-06T19:48:01.593 回答