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

时间:2016-07-14 05:23:50

标签: c# regex html5

我需要为“text”类型输入创建一个模式,只允许从0到特定最大值的数字,同时验证特定的小数位数。

快速举例: 最大值= 300.86 最大小数位数= 3

有效输入:
0
1
300个
300.86
300.85
300.850
300.851
0.2
0.3333

输入无效:
-1
301个
300.87
300.861
1,30.2
1,0.0
,.1

目前我只知道如何使用此模式验证小数位数:
    ^ [0-9] *(\ d {1,{0}})?$

注意: 我不能使用type = number因为我不能使用任何模式:(

请帮助

2 个答案:

答案 0 :(得分:0)

我认为这样的事情就是你所追求的:

^(300(?:\.(?:[0-7]\d{0,2}|8(?:[0-5]\d?|60?)?))?|[0-2]?\d{0,2}(?:\.\d{0,3})?)$

See it here at REGEX STORM

(不得不在那里进行调整,以\r结束,因为即使选择了多行,REGEX 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?更改)

这些部分位于由替换 - |分隔的捕获组中。整个表达式必须位于字符串(^)(或带有多行标志的)的开头,并且位于相同的末尾($)。< / p>

修改

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

修改2

完全错过了“最大小数位数”部分。固定。 (被“有效”示例0.3333愚弄)

答案 1 :(得分:0)

我对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

或者,如果你有一个函数可以在一个给定的字符(如十进制或逗号)上拆分字符串,那么你只需在十进制上拆分输入,清理代码中的第一面,然后继续上面代码的最后三行。这样可以避免使用温和复杂的正则表达式。