Javascript 用于定义大小的有效数字的正则表达式(任何语言)

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

我本以为这会相当普遍,但还没有找到解决办法

我想要的是一个正则表达式,它在一组有效数字(最大值)上失败,但传递的值小于最大值。我希望它同时使用点或逗号(法语)十进制分隔符

因此,对于15个有效数字,这些应该通过:
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+))
    积极前瞻,确保后续内容与以下内容匹配
    • \d{1,15}(?:[,]0+)-0*$
      选项1
      • \d{1,15}
        任何数字字符的1和15之间的匹配
      • (?:[,]0+)
        匹配一个十进制符号
        ,.
        ,后跟一个或多个
        0
        s,但可以是零或一次
      • 0*
        按字面意思匹配任意数量的
        0
        s
      • $
        在行尾断言位置
    • (?:(?=.{1,16}0*$)(?:\d+[,]\d+)
      选项2
      • (?=.{1,16}0*$)
        确保以下内容与以下内容匹配
      • {1,16}
        匹配1到16次之间的任何字符
      • 0*
        按字面意思匹配任意数量的
        0
        s
      • $
        在行尾断言位置
      • (?:\d+[,]\d+)
        匹配以下内容
      • \d+
        匹配1到无限次之间的任何数字
      • [,.]
        匹配十进制字符
      • \d+
        匹配1到无限次之间的数字
  • +
    将任何字符匹配一次或多次
  • $
    在行尾断言位置(实际上不需要,但我认为它有助于可读性)

您有冲突<代码>-1234567890123450是16位有效数字,而
-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+)‌​)).+$