【问题标题】:Trying to build a regular expression to check pattern - 2尝试构建正则表达式来检查模式 - 2
【发布时间】:2011-12-22 11:58:30
【问题描述】:

我想知道是否可以添加更多检查:[以前回答的问题]( Trying to build a regular expression to check pattern)。

Brian Rogers 使用这个正则表达式很好地解决了上述问题:

/^([1-9]|[12][0-9]|3[01])(-([1-9]|[12][0-9]|3[01]))?(,([1-9]|[12][0-9]|3[01])(-([1-9]|[12][0-9]|3[01]))?)*$/  

[供参考,再次发布老问题]

  1. 以数字开头和结尾
  2. 连字符应以数字开头和结尾
  3. 逗号应该以数字开头和结尾
  4. 数字范围应为 1-31
  5. 如果数字以连字符 (-) 开头,则不能以逗号以外的任何其他字符结尾,并遵循上面列出的所有规则。

例如2-2,12,2-1 有效,而 1-1-1-1 无效。

例如:
- 1-5,5,15-29
- 1,28,1-31,15
- 15,25,3 - 1-24,5-6,2-9

这可以更进一步并添加其他验证吗?

1) 数字应按升序排列
例如:
- 1,2-3 - 有效
- 4-6,23 - 有效
- 23,4-5 - 无效

2) 数字不应重复
例如:
a) 2,2,2 - 无效
b) 2,3-6,3 - 无效
c) 2,5,7-20 - 有效

3) 如果可能
如果先前在范围内定义,则数字不应重复
例如:
a) 2,3-6, 4 - 无效,因为 4 已经是 3 到 6 之间的数字
b) 12-16、14-18 - 无效,因为 14,15 和 16 已在 12-16 中定义
c) 9-13、15、17-19 - 有效

【问题讨论】:

  • 否 - 您开始提出依赖于特定字符序列的解释的问题(例如,3-6 代表整数 3、4、5 和 6) .你不能在正则表达式中处理这样的事情。
  • @M42 - 对于 cmets 中的链接,将文本放在方括号 ([]) 中,然后将 URL 紧跟在圆括号 (()) 中,例如[this question](http://somewhere)
  • @Damien_The_Unbeliever:我试图将其作为答案,但它来自 cmets,我不知道为什么 :(,现在编辑评论为时已晚。
  • 正如 Damien 所说,正则表达式不是用来解决这类问题的。它们在词汇层面工作,而不是语义层面(值的空间)。如果你有语义规则要检查,解析正则表达式以提取数字和范围,然后用一堆代码检查规则。

标签: regex match


【解决方案1】:

正则表达式应该检查模式而不是处理业务逻辑。当你开始用“if ... then ... else”陈述你的问题时,这不是正则表达式应该处理的事情。

【讨论】:

    【解决方案2】:

    正则表达式非常强大,可以潜在地用于解决您所面临的挑战 - 甚至实现某种业务逻辑验证。

    从架构和软件工程的角度来看,我建议您重构问题并使用程序代码来解决问题。让我解释一下原因:代码会得到 ​​p>

    • 很难阅读和理解
    • 容易出错且不易测试
    • 维护成本将飙升

    总而言之,尽管正则表达式非常强大(我在我的应用程序中也大量使用它们),但我不会过度使用它。他们在解决一些问题时非常优雅,但在解决简单的事情时变得非常丑陋。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-16
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      • 2021-12-04
      • 2016-08-31
      • 1970-01-01
      相关资源
      最近更新 更多