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

cle*_*est 8 regex

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

.5
0.5
1.5
1234
Run Code Online (Sandbox Code Playgroud)

但不是

0.5.5
absnd (any letter character or space)
Run Code Online (Sandbox Code Playgroud)

我有这个满足所有但是 0.5.5

^[.?\d]+$
Run Code Online (Sandbox Code Playgroud)

Jus*_*gan 22

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

^[+-]?(\d*\.)?\d+$
Run Code Online (Sandbox Code Playgroud)

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

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

\b有一句话休息,但我使用它作为需要在字符串的结尾至少一个数字偷偷摸摸.这样,空字符串或单个字符串+将不匹配.

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

  • 似乎我们有一个围绕这些部分的巨魔。我也被否决了。 (2认同)
  • 当您考虑千位分隔符时,它会变得有点粗略,因为某些国家/地区会交换句点和逗号。 (2认同)

Tyl*_*ton 10

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

^[+-]?(?:\d*\.)?\d+$
Run Code Online (Sandbox Code Playgroud)

编辑:为什么要downvote?

  • *伸出握手* (2认同)

Spi*_*gal 6

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

^\d*\.?\d+$
Run Code Online (Sandbox Code Playgroud)

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

  • 最后至少需要一位数字。
    7Works
    77Works
    .77Works
    0.77Works
    0.不起作用
    空字符串不起作用
  • 数字前的单个句点是可选的。
    .77作品
    77的作品
    ..77不工作
  • (可选)时间段之前的任何数字。 .77作品
    0.77作品
    0077.77作品
    0077作品

不使用前瞻性和后视性的另一个好处是不必担心基于RegEx的DOS攻击。

高温超导