正则表达式模式,用于验证具有最大值和最大小数位的文本输入
本文关键字:小数 输入 文本 最大值 模式 用于 验证 正则表达式 | 更新日期: 2023-09-27 17:56:48
我需要为"文本"类型输入创建一个模式,只允许从 0 到特定最大值的数字,同时验证到特定的小数位数。
快速示例:最大值 = 300.86最大小数位数 = 3
有效输入:
0
1300
300,86
300,85
300.850
300.851
。阿拉伯数字
0.3333
无效输入:
-1
301
300,87
300.861
1,30,2
1,.0
,.1
目前我只知道如何使用此模式验证小数位数:
^[,0-9]*(.''d{1,{0}})?$
注意:我不能使用 type=number,因为我不能在该:(中使用任何模式
请帮忙
我认为这样的东西是你所追求的:
^(300(?:'.(?:[0-7]'d{0,2}|8(?:[0-5]'d?|60?)?))?|[0-2]?'d{0,2}(?:'.'d{0,3})?)$
在REGEX STORM上看到它。
(必须在那里调整它,以'r
结尾,因为即使选择了多行,正则表达式 STORM 也不会将$
与行尾匹配???)
解释
它由两部分组成。后者[0-2]?'d{0,2}(?:'.'d{0,3})?
测试低于 300 的数字。它可选择以0
、1
或2
([0-2]?
)开头。然后任何两位数字都可以跟在 ( 'd{0,2}
)。然后,可以选择性地,它后面跟一个.
,如果存在,后面最多可以跟三位数字(小数)((?:'.'d{0,3})?
)。
第一部分 - 300(?:'.(?:[0-7]'d{0,2}|8(?:[0-5]'d?|60?)?))?
- 测试整数部分何时正好为 300。然后可以选择后跟一个小数点,以及三种情况中的一种:
-
[0-7]'d{0,2}
0
到7
范围内的数字,后跟最多两位数字 -
8(?:[0-5]'d*|60*)?
8
后跟0
到5
范围内的数字,可以选择后跟一个数字([0-5]'d?
交替)。 - 或数字 86 和一个选项所有
0
(60?
交替)
这些部分位于由交替 - |
分隔的捕获组中。整个表达式必须位于字符串的开头(^
)(或带有多行标志的行)和同一字符串的末尾($
)。
编辑
做了一些调整,导致一些数字错误地失败了。
编辑 2
完全错过了"最大小数位数"部分。 固定。(被"有效"的例子愚弄了0.3333
)
我对 C# 一无所知,所以我只需要假设我在 Python 中可以做的事情,你可以在 C# 中找到一些方法。我会在伪代码中给你我的建议(这并不意味着镜像 Python)。
maxValue = some number
nDecimals = some number
givenValue = text with some number to be tested
#split number on decimal; remove non-digit characters from each side
leftSideOfDecimal = Replace(pattern = '^('d{1,3}(,'d{3})*)('.'d*)$', replacement = ''1', givenValue)
leftSideOfDecimal = Replace(',', '', leftSideOfDecimal)
rightSideOfDecimal = Replace('^('d{1,3}(,'d{3})*)('.'d*)$', ''3', givenValue)
rightSideOfDecimal = Replace(''.','',rightSideOfDecimal)
leftSideOfDecimal = pass leftSideOfDecimal to function to change type from text to integer
if leftSideOfDecimal <= maxValue and numberOfCharacters(rightSideOfDecimal) == nDecimals:
do whatever you want
或者,如果您有一个函数,可以通过该函数在给定字符(如小数或逗号)上拆分字符串,则只需拆分小数点上的输入,像代码中一样清理第一边,然后继续上面的代码的最后三行。这样就可以使您不必使用稍微复杂的正则表达式。