正则表达式模式,用于验证具有最大值和最大小数位的文本输入

本文关键字:小数 输入 文本 最大值 模式 用于 验证 正则表达式 | 更新日期: 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 的数字。它可选择以012[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} 07 范围内的数字,后跟最多两位数字
  • 8(?:[0-5]'d*|60*)? 8后跟 05 范围内的数字,可以选择后跟一个数字([0-5]'d?交替)。
  • 或数字 86 和一个选项所有060?交替)

这些部分位于由交替 - | 分隔的捕获组中。整个表达式必须位于字符串的开头(^)(或带有多行标志的)和同一字符串的末尾($)。

编辑

做了一些调整,导致一些数字错误地失败了。

编辑 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
或者,如果您有一个函数,可以通过

该函数在给定字符(如小数或逗号)上拆分字符串,则只需拆分小数点上的输入,像代码中一样清理第一边,然后继续上面的代码的最后三行。这样就可以使您不必使用稍微复杂的正则表达式。