我原本以为这会相当普遍,但还没有找到解决方案
我想要的是一个正则表达式,它在一定数量的有效数字(最大值)上失败,但是传递的数量小于最大值。我希望它能同时使用点或逗号(法语)小数分隔符。
因此对于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
但你可以看到最后几个仍然通过,任何指针?
答案 0 :(得分:1)
对于实际科学记数法(前导零在小数符号之前重要),您可以使用以下
^-?(?=\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,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到无限次的数字.+
匹配任何字符一次或多次$
断言位置末尾的位置(不是真的需要,但我认为可读性有帮助)