【问题标题】:A Regular expression for validating Range-like expressions用于验证 Range-like 表达式的正则表达式
【发布时间】:2011-12-23 16:28:29
【问题描述】:

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

目标是根据用户输入验证“范围”表达式,如下所示:

  • 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)");

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

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

【问题讨论】:

    标签: c# regex


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      这将是检查语法的正则表达式,它不知道字符串的语义!

      ^(?<=\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)!

      【讨论】:

      • 非常感谢,这正是我要找的!我想我会同时使用您的解决方案和 Guffa 建议的解决方案,以使其完全失效并过滤掉多余的部分(如 20-40,22)。
      猜你喜欢
      • 2017-04-12
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多