定义大小的重要数字的正则表达式(任何语言)
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+))).+$
然而,下一个正则表达式适用于前导零的情况,无论小数点位置如何。
^-?(?=\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
s
$
断言行尾的位置
(?:(?=.{1,16}0*$)(?:\d+[.,]\d+))
选项 2
(?=.{1,16}0*$)
确保以下内容与以下内容匹配
.{1,16}
匹配任意字符1到16次
0*
按字面意思匹配任意数量的 0
s
$
断言行尾的位置
(?:\d+[.,]\d+)
匹配以下
\d+
匹配 1 到无限次之间的任何数字
[,.]
匹配一个十进制字符
\d+
匹配 1 到无限次之间的数字
.+
匹配任意字符一次或多次
$
在行尾断言位置(不是真的需要,但我认为它有助于提高可读性)
我原以为这会很常见,但还没有找到解决方案
我想要的是一个正则表达式,它在一定数量的有效数字(最大值)上失败,但通过小于最大值。我希望它能同时使用点或逗号(法语)小数点分隔符。
所以对于 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+))).+$
然而,下一个正则表达式适用于前导零的情况,无论小数点位置如何。
^-?(?=\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
s$
断言行尾的位置
(?:(?=.{1,16}0*$)(?:\d+[.,]\d+))
选项 2(?=.{1,16}0*$)
确保以下内容与以下内容匹配.{1,16}
匹配任意字符1到16次0*
按字面意思匹配任意数量的0
s$
断言行尾的位置(?:\d+[.,]\d+)
匹配以下\d+
匹配 1 到无限次之间的任何数字[,.]
匹配一个十进制字符\d+
匹配 1 到无限次之间的数字
.+
匹配任意字符一次或多次$
在行尾断言位置(不是真的需要,但我认为它有助于提高可读性)