定义大小的重要数字的正则表达式(任何语言)

Regex for significant figures of a defined size (any language)

我原以为这会很常见,但还没有找到解决方案

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

所以对于 15 位有效数字,这些应该通过:
0
0.00
1
-1
1.23456789012345
10.2345678901234
12.3456789012345
-123.4
-12.34
-1,33
-1.33
-123456789012345
-1234567890123450
-12345678901234.50
12345678901234.50
123456789012345.00

// 应该失败:
-1234567890123456
-12345678901234.56
12345678901234.56
123456789012345.60
1.234567890123456
12.34567890123456
123456789012340.6
123456789012300.67
123456789012300000000000.67
10000000000010000000001000010000000001.22

我知道我需要使用消极的眼神,到目前为止我已经接近了:

^(?!(?:.*?[1-9]){15,})([-+]?\s*\d+[\.\,]?\d*?)$

https://regex101.com/r/hQ1rP0/218

但你可以看到最后几个仍然通过,有什么指示吗?

代码

对于实际的科学记数法(前导零在小数点之前很重要),您可以使用以下内容

^-?(?=\d{1,15}(?:[.,]0+)?$|(?:(?=.{1,16}0*$)(?:\d+[.,]\d+)))‌.+$

然而,下一个正则表达式适用于前导零的情况,无论小数点位置如何。

See this regex in use here

^-?(?=\d{1,15}(?:[.,]0+)?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 字面意思,但可以是零次或一次
      • 0* 按字面意思匹配任意数量的 0s
      • $ 断言行尾的位置
    • (?:(?=.{1,16}0*$)(?:\d+[.,]\d+)) 选项 2
      • (?=.{1,16}0*$) 确保以下内容与以下内容匹配
      • .{1,16}匹配任意字符1到16次
      • 0* 按字面意思匹配任意数量的 0s
      • $ 断言行尾的位置
      • (?:\d+[.,]\d+)匹配以下
      • \d+ 匹配 1 到无限次之间的任何数字
      • [,.]匹配一个十进制字符
      • \d+ 匹配 1 到无限次之间的数字
  • .+ 匹配任意字符一次或多次
  • $ 在行尾断言位置(不是真的需要,但我认为它有助于提高可读性)