2011-12-23 63 views
0

我在构建正则表达式时遇到了问题,因为我真的是主题的noob。用于验证类似范围表达式的正则表达式

目的是验证来自用户的输入 '范围' 的表达式,如下所示:

  • 20-30
  • 11,12(2和4)(和20之间30)
  • -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)"); 

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

有没有人知道如何做到这一点而不浪费整整一周(就像我会)?非常感谢您提前!

回答

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)!

+0

非常感谢您,那正是我期待的!我想我会同时使用您的解决方案和Guffa建议的解决方案,使其完全失效并滤除多余的部件(如20-40,22)。 – jkokorian 2011-12-23 09:34:04

2

我认为你应该首先在逗号上分割它们,然后验证并解析每个项目。没有办法写一个正则表达式来验证数字是否合理。

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

+0

谢谢,你有一点。我去做。 – jkokorian 2011-12-23 09:34:49