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

时间:2017-10-19 14:54:41

标签: 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
-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

但你可以看到最后几个仍然通过,任何指针?

1 个答案:

答案 0 :(得分:1)

代码

对于实际科学记数法(前导零在小数符号之前重要),您可以使用以下

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