用于验证类似范围的表达式的正则表达式

时间:2011-12-23 08:07:22

标签: c# regex

我在制作正则表达式时遇到了麻烦,因为我真的是这个主题的菜鸟。

目标是从用户输入验证'range'表达式,如下所示:

  • 20-30(20至30之间)
  • 11,12(2和4)
  • -10(小于10)
  • 80-(大于80)

或其中任意数量的组合,例如:

-10,11,12,20-30,80 -

我已经能够使用以下方法从这样的字符串中解析不同的组件 正则表达式(并调用.GetMatches()):

var rangeRegex = new Regex(@"\d+(\.\d+)?-\d+(\.\d+)?");
var smallerThanRegex = new Regex(@"(?<![\d\.])-\d+(\.\d+)?");
var greaterThanRegex = new Regex(@"\d+(\.\d+)?-(?!\d)");

我只是不确定如何将它们组合成一个大的正则表达式,可用于验证字符串是否是有效的“范围表达式”。

有没有人知道怎么做而不浪费整整一周(就像我想的那样)?非常感谢你提前!

2 个答案:

答案 0 :(得分:2)

我认为你应该首先将它们分成逗号,然后验证并解析每个项目。没有任何方法可以编写正则表达式来验证数字是否有意义。

考虑例如1,2,1,1,210-20,11-12,14-16之类的输入,其中您有重复的值和重叠范围。您必须决定如何处理不一致的数据,例如是否允许和合并重叠范围,以及范围是否必须以正确的顺序排列。

答案 1 :(得分:1)

这将是检查语法的正则表达式,它没有关于字符串语义的想法!

^(?<=\D|^)(?:\d+(?:\.\d+)?-\d+(?:\.\d+)?|-\d+(?:\.\d+)?|\d+(?:\.\d+)?-|\d+(?:\.\d+)?)(?:,(?:\d+(?:\.\d+)?-\d+(?:\.\d+)?|-\d+(?:\.\d+)?|\d+(?:\.\d+)?-|\d+(?:\.\d+)?))*(?=\D|$)$

here on Regexr

但像Guffa所说的那样分裂可能是更好的解决方案(+1)!