正则表达式:检查十进制数[关闭]

问题描述 投票:-3回答:2

我有跟随正则表达式来检查小数字和防止长精度。我想防止精度超过18位。但实际的数字可以是任何长的。这个正则表达式的错误在哪里?

^[+-]?([0-9]*[.])?(?([^.])([0-9]{1,18})|([0-9]))$

但是:ぁzxswい

php regex if-statement
2个回答
2
投票

简要

你遇到的最大的问题是你实际上并没有与大多数模式匹配任何东西,因为你正在使用一个积极的前瞻(这几乎只是一个断言,确保位置匹配你的前瞻包含的任何东西),然后你'试图断言这个位置是https://regex101.com/r/vC2yW4/38线的终点。因为你的所有字符串都没有真正匹配$的模式,所以你没有得到任何结果。

^[+-]?([0-9]*[.])?$你现在会看到另外一个问题。你在Changing the positive lookahead to a simple capture group and removing $(这是好的)之前得到了一切,但在实例中.不存在,或者在.之后的数字的情况下,你只匹配一个数字。

.更改为|\d适用于小数位,但是你的整数呢? |\d{1,18}。另请注意,您的小数位数正确匹配,但整数不是(如果它们超过18位)。

现在,你没有正确匹配整数的原因是由于Now a new issue has surfaced。虽然逻辑似乎可能有效,但实际上确保在任意数量的数字之前存在([0-9]*[.])?。这可以防止您匹配长度超过18位的整数。现在是我的实际答案......


.

See regex in use here

结果

Input

^[+-]?\d*\.?\d{1,18}$

Output

只有比赛如下所示。

0781234567.1564529874654654231
684984654657465
0784543213
.264556
0.2564

说明

  • 684984654657465 0784543213 .264556 0.2564 在线的开头断言位置
  • ^匹配零或一个[+-]?+
  • -匹配任意位数
  • \d*匹配零或一个字面点字符\.?
  • .匹配任何数字的1到18之间
  • \d{1,18}在线的末尾断言位置

在Layman的术语中,我们匹配任意数量的数字,然后可能是一个点,然后是1-18个数字。

  1. 但这对18位数以上的整数(如19位数)有何影响? $实际上匹配18位数,因为它占有欲,然后\d*匹配最后一位数。
  2. 好的,很好,但对于低于或等于18位的数字(比方说10位数),它是如何工作的? \d{1,18}匹配所有10位数字
  3. 好的,包含超过18位数的整数的十进制数怎么样? \d{1,18}匹配任意数量的数字,然后\d*匹配一个文字点,然后\.确保至少1位小数,最多存在18位小数

-1
投票

如果我理解正确,你想要最多只有18位的数字,这可以通过以下表达式解决:

\d{1,18}

希望这可以帮助

© www.soinside.com 2019 - 2024. All rights reserved.