【发布时间】: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-31
- 如果数字以连字符 (-) 开头,则不能以逗号以外的任何其他字符结尾,并遵循上面列出的所有规则。
例如2-2,1 或 2,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 所说,正则表达式不是用来解决这类问题的。它们在词汇层面工作,而不是语义层面(值的空间)。如果你有语义规则要检查,解析正则表达式以提取数字和范围,然后用一堆代码检查规则。