我在制作正则表达式时遇到了麻烦,因为我真的是这个主题的菜鸟。
目标是从用户输入验证'range'表达式,如下所示:
或其中任意数量的组合,例如:
-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)");
我只是不确定如何将它们组合成一个大的正则表达式,可用于验证字符串是否是有效的“范围表达式”。
有没有人知道怎么做而不浪费整整一周(就像我想的那样)?非常感谢你提前!
答案 0 :(得分:2)
我认为你应该首先将它们分成逗号,然后验证并解析每个项目。没有任何方法可以编写正则表达式来验证数字是否有意义。
考虑例如1,2,1,1,2
或10-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|$)$
但像Guffa所说的那样分裂可能是更好的解决方案(+1)!