Javascript 用于定义大小的有效数字的正则表达式(任何语言)
我本以为这会相当普遍,但还没有找到解决办法 我想要的是一个正则表达式,它在一组有效数字(最大值)上失败,但传递的值小于最大值。我希望它同时使用点或逗号(法语)十进制分隔符 因此,对于15个有效数字,这些应该通过:Javascript 用于定义大小的有效数字的正则表达式(任何语言),javascript,regex,negative-lookahead,Javascript,Regex,Negative Lookahead,我本以为这会相当普遍,但还没有找到解决办法 我想要的是一个正则表达式,它在一组有效数字(最大值)上失败,但传递的值小于最大值。我希望它同时使用点或逗号(法语)十进制分隔符 因此,对于15个有效数字,这些应该通过: 0 0.00 1 -1 1.23456789012345 10.2345678901234 12.3456789012345 -123.4 -12.34 -1,33 -1.33 -123456789012345 -1234567890123450 -1234567890134.50 1
0
0.00
1
-1
1.23456789012345
10.2345678901234
12.3456789012345
-123.4
-12.34
-1,33
-1.33
-123456789012345
-1234567890123450
-1234567890134.50
1234567890134.50
123456789012345.00 //应失败:
-1234567890123456
-1234567890134.56
1234567890134.56
123456789012345.60
1.234567890123456
12.34567890123456
12345678901340.6
12345678901300.67
1234567890123000000000.67
10000000000100000010000000010000000000000001.22 我知道我需要用消极的眼光看问题,到目前为止,我已经接近了这一点:
^(?!(?:.[1-9]){15,})([-+]?\s*\d+[\.\,]?\d*?)$
但是您可以看到最后几个仍然通过,有指针吗?代码
对于实际的科学记数法(其中前导零在十进制符号之前很重要),可以使用以下公式
^-?(?=\d{1,15}(?:[.,]0+)?$|(?:(?=.{1,16}0*$)(?:\d+[.,]\d+))).+$
然而,下一个正则表达式适用于前导零的情况,而不考虑小数点的位置
解释
在行首断言位置^
按字面意思匹配零或一个-?
字符-
积极前瞻,确保后续内容与以下内容匹配(?=\d{1,15}(?:[,]0+)?0*$|(?:(?=(?=。{1,16}0*$)(?:\d+[,]\d+))
选项1\d{1,15}(?:[,]0+)-0*$
任何数字字符的1和15之间的匹配\d{1,15}
匹配一个十进制符号(?:[,]0+)
,后跟一个或多个,.
s,但可以是零或一次0
按字面意思匹配任意数量的0*
s0
在行尾断言位置$
选项2(?:(?=.{1,16}0*$)(?:\d+[,]\d+)
确保以下内容与以下内容匹配(?=.{1,16}0*$)
匹配1到16次之间的任何字符{1,16}
按字面意思匹配任意数量的0*
s0
在行尾断言位置$
匹配以下内容(?:\d+[,]\d+)
匹配1到无限次之间的任何数字\d+
匹配十进制字符[,.]
匹配1到无限次之间的数字\d+
将任何字符匹配一次或多次+
在行尾断言位置(实际上不需要,但我认为它有助于可读性)$
-12345678901233456
也是16位无效数字这是正确的,因为-1234567890123450是16位数字,但以0结尾,所以只有15位有效数字与科学记数法相关。其中as-1234567890123456在小数点前有16个与科学记数法相关的数字是有效的。^-(?=\d{1,15}(?:[,]0+)$)(?:(?=.{1,16}0*$)(?:\d+[,]\d+)。+$
,带有奇怪的有效数字逻辑,然而,^-(?=\d{1,15}:[,]0+,]0*(?:,]0*)(?:,,,[\d+)(?:,无法更新问题。但我希望能够忽略尾随的零。也就是说,我想计算有效数字,但如果它们是终端零,则忽略它们。因此,在我的例子中,如果没有非零十进制数,则忽略十进制数前的0,如果有,则将其包括在内。我试图抓住科学记数法不准确的例子。
^-?(?=\d{1,15}(?:[.,]0+)?0*$|(?:(?=.{1,16}0*$)(?:\d+[.,]\d+))).+$