精度(p):小数点左右的总位数
小数位数:小数点右侧的总位数
考虑到目前为止我的以下正则表达式:
^-?[0-9]+(\.[0-9]{1,3})?$
- -?可选负数
- [0-9] 匹配数字 0-9
- “+”任意位数
- “(\.[0-9]{1,3})?”可选 1-3 位小数
示例:
100.95 has a precision of 5 and a scale of 2 (5,2)
我知道如何将总数限制在左侧,将总数限制在右侧,但不知道如何封装整个值以限制“p,精度”部分,并忽略该计数中存在的句点。总计数中的 - 也需要被忽略。
更新:
这似乎有效......
^(?=(\D*\d\D*){0,5}$)-?([0-9]+)?(\.?[0-9]{0,2})?$
blank line matches
0 - match
1 - match
123 - match
123.12 - match
-1 - match
123.122 - no match
最佳答案
您可以使用 lookahead assertion从一开始就验证字符串中的数字是否与您需要的数字完全相同。
(?=(\D*\d\D*){5}$)
这将使你的整个表达式如下:
(?=(\D*\d\D*){5}$)^-?[0-9]+(\.[0-9]{1,3})?$
(为了简洁和可读性,我使用 shorthand character classes \d
(数字)和 \D
(非数字)。)
它匹配一个数字\d
,可能被非数字字符 \D*
包围我们不关心,并确保恰好匹配五次 {5}
之前$
字符串末尾。
更新:
这是您选择的表达式,经过一些调整进行了简化:
^(?=(\D*\d\D*){0,5}$)-?\d*(\.\d{0,2})?$
\d
与 [0-9]
相同,因此您有一些可以删除的冗余。
-
([\d0-9]+)?
可能真的只是\d*
(不确定您是否确实使用了捕获组,在这种情况下,您应该在其周围保留括号:(\d*)
) -
\.?
不需要?
因为它后面可以跟 0 位数字,并且它所在的组有?
已经 -
[\d0-9]{0,2}
可以是\d{0,2}
关于javascript - 如何创建像 SQL 小数类型一样匹配 (p,s) 精度和小数位数的正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36465131/