【问题标题】:Regex Pattern to Validate Text Input With Max Value and Max Decimal Place使用最大值和最大小数位验证文本输入的正则表达式模式
【发布时间】:2016-07-14 05:23:49
【问题描述】:

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

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

有效输入:
0
1
300
300.86
300.85
300.850
300.851
.2
0.3333

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

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

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

请帮忙

【问题讨论】:

  • 正则表达式并不是确定数字大小的好工具。您可以使用 .NET 代码检查最大限制,然后还应用您的小数位验证器吗?这对我来说似乎比所有内容的正则表达式更干净。
  • @ClasG 对不起,我错过了。这是无效的。我只是想表明接受带逗号的数字抱歉

标签: c# regex html


【解决方案1】:

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

^(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? 替代)

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

编辑

做了一些调整,因为一些数字错误地失败了。

编辑 2

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

【讨论】:

  • 仅供参考:多行模式下的$ 只匹配\n 之前,而不是\r\n 之前。
  • 好的。很高兴知道。谢谢@WiktorStribiżew
  • @ClasG 哇不错的正则表达式,它对带逗号的数字失败了,但如果我可以调整它,我会尝试谢谢
  • “带逗号的数字”是什么意思?
  • 例如,如果最大值是 1350.567,那么 1,350 应该是有效的
【解决方案2】:

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

或者,如果您有一个函数可以在给定字符(如小数或逗号)上拆分字符串,那么您只需将输入拆分为小数,按照代码中的方式清理第一边,然后继续执行上面代码的最后三行。这样一来,您就不必使用稍微复杂的正则表达式了。

【讨论】:

  • 我猜这里,但如果 OP 可以选择使用代码,OP 可能会使用类似 if( (decimal.Parse(sVal)&lt;=dLimit) &amp;&amp; (sVal.Length-sVal.LastIndexOf('.')&lt;=4) ...
  • @Chad 抱歉,我需要在客户端进行验证 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
相关资源
最近更新 更多