正则表达式匹配小数值范围

时间:2009-07-22 12:32:15

标签: c# regex validation

是否有一种简单的方法可以获取动态十进制值并创建一个可以处理此问题的验证正则表达式?

例如,我知道/1[0-9]{1}[0-9]{1}/应匹配100-199之间的任何内容,那么在给定任何十进制数的情况下以编程方式创建类似结构的最佳方法是什么?

我在想我可以循环遍历每个数字并从那里建立一个数字,但我不知道我会怎么做。

4 个答案:

答案 0 :(得分:1)

使用正则表达式很难正确处理范围。 RE是用于基于文本的分析或模式匹配的工具,而不是语义分析。您可以安全地做的最好的事情是识别一个具有一定数字位数的字符串。您可以使用基数10对数为范围的最大或最小位数构建RE。例如,匹配 a b 之间的数字,其中 b > a ,通过以下方式构建RE:

re = "[1-9][0-9]{"
re += str(log10(a)-1)
re += "-"
re += str(log10(b)-1)
re += "}"

注意:示例中没有特定的编程语言。对不起,这里没有真正说过C#。

存在一些边界点问题,但基本思想是为100到999之间的任何内容构造类似[1-9][0-9]{1}的RE,然后如果字符串与表达式匹配,则转换为整数并在中进行范围分析价值空间而不是词汇空间。

所有这些都说......我会选择Mehrdad的解决方案并使用decimal.TryParse等语言提供的内容,然后检查结果。

答案 1 :(得分:1)

^ [ - ](\ d +)?\ d + $

将验证前面带有可选小数点和/或减号的数字

答案 2 :(得分:0)

不,这是一个简单的答案。生成正常工作的正则表达式比执行以下操作更复杂:

  1. 十进制正则表达式(在字符串中查找十进制数)。 "^\$?[+-]?[\d,]*(\.\d*)?$"
  2. 将结果转换为小数并与您的范围进行比较。 (decimal.TryParse
  3. 这取决于您要解析的位置和内容。

答案 3 :(得分:0)

使用以下RegEx来解析数字的字符串。 可以处理逗号和点。

[^\d.,](?<number>(\d{1,3}(\.\d{3})*,\d+|\d{1,3}(,\d{3})*\.\d+|\d*[,\.]\d+|\d+))[^\d.,]