我有跟随正则表达式来检查小数字和防止长精度。我想防止精度超过18位。但实际的数字可以是任何长的。这个正则表达式的错误在哪里?
^[+-]?([0-9]*[.])?(?([^.])([0-9]{1,18})|([0-9]))$
但是:ぁzxswい
你遇到的最大的问题是你实际上并没有与大多数模式匹配任何东西,因为你正在使用一个积极的前瞻(这几乎只是一个断言,确保位置匹配你的前瞻包含的任何东西),然后你'试图断言这个位置是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
^[+-]?\d*\.?\d{1,18}$
只有比赛如下所示。
0781234567.1564529874654654231
684984654657465
0784543213
.264556
0.2564
684984654657465
0784543213
.264556
0.2564
在线的开头断言位置^
匹配零或一个[+-]?
或+
-
匹配任意位数\d*
匹配零或一个字面点字符\.?
.
匹配任何数字的1到18之间\d{1,18}
在线的末尾断言位置在Layman的术语中,我们匹配任意数量的数字,然后可能是一个点,然后是1-18个数字。
$
实际上匹配18位数,因为它占有欲,然后\d*
匹配最后一位数。\d{1,18}
匹配所有10位数字\d{1,18}
匹配任意数量的数字,然后\d*
匹配一个文字点,然后\.
确保至少1位小数,最多存在18位小数如果我理解正确,你想要最多只有18位的数字,这可以通过以下表达式解决:
\d{1,18}
希望这可以帮助