【问题标题】:Regex to accept numbers and/or number range separated by commas, but between range 1-64正则表达式接受以逗号分隔的数字和/或数字范围,但范围在 1-64 之间
【发布时间】:2015-01-15 15:05:06
【问题描述】:

我需要验证用户输入的字符串。 字符串应允许数字或范围,以逗号分隔。数字必须介于 1 到 64 之间。

Sample: 1,8,7-9,10-12,20-45

逗号或“-”前后允许有空格。

【问题讨论】:

  • 在我看来,正则表达式并不是解决这个问题的最佳方式。我会先用逗号分割字符串,然后检查里面是否是 # 或范围。如果是后者,则拆分连字符并验证范围的第一部分小于最后一部分。
  • 用正则表达式检查数值就像用锤子搅拌油漆。你可以做到,但这不是最好的方法。

标签: regex numbers expression comma hyphen


【解决方案1】:

给你,

^(?:6[0-4]|[1-5]\d|[1-9])(?: *- *(?:6[0-4]|[1-5]\d|[1-9]))?(?: *, *(?:6[0-4]|[1-5]\d|[1-9])(?: *- *(?:6[0-4]|[1-5]\d|[1-9]))?)*$

我使用<space>* 而不是\s*,因为\s 也匹配换行符。如果您对换行符没有问题,请使用\s 而不是空格。如果您想允许可选的空格不是零个或多个空格,请使用\s? 而不是<space>*

DEMO

【讨论】:

  • 这是一个非常简洁的演示工具
  • @AvinashRaj 它几乎完美,只是它不验证单个数字或单个范围,例如只说“7”或“1-7”。
  • 我已经告诉过您需要将最后一个+ 更改为*,以便它接受sing;e 号码。
  • 错过了。非常感谢。
【解决方案2】:

这应该匹配 1-64 之间的整数。

([1-9]|[1-5][0-9]|6[0-4])

这也应该接受范围。

([1-9]|[1-5][0-9]|6[0-4])(-([1-9]|[1-5][0-9]|6[0-4]))?

在一行中匹配一个或多个。

^(([1-9]|[1-5][0-9]|6[0-4])(-([1-9]|[1-5][0-9]|6[0-4]))?\s*($|,\s*))+$

【讨论】:

  • 但是如何判断它是一个范围,例如 20-45 而不是 64-45?只能希望没有这样的价值观!
  • 我不会使用正则表达式来验证这一点。在任何编程语言中编写一个函数来检查它是微不足道的。我想不出用正则表达式来做这件事的合理方法。
  • 简洁明了。但它最后接受逗号。
【解决方案3】:

这看起来会很糟糕。我不认为有一个简单的答案,因为正则表达式匹配字符串,而不是数字。事实证明,0 到 64 之间的数字看起来像这样

[1-6]?[0-9]

有些可能包含一个范围(但不是空格或逗号)

[1-6]?[0-9](\-[1-6]?[0-9])?

编辑

在这里,我手动输入了空格和逗号以及“?”直接在(出现一次或根本不出现)之后,如果您允许多个空格,请更改相关的“?”到 "*" 我不能 100% 保证这会奏效,但我相信它会一点一点地构建它。

\([1-6]?[0-9]\( ?\- ?[1-6]?[0-9]\)? ?,? ?\)+

如果我做得更好,我会尝试更新。

EDIT2

如果我正确写入分组,我的旧模式将匹配 0。让我们试试这个:

((([1-5]?[0-9])|(6[0-4])((\s?\-\s?([1-5]?[0-9])|(6[0-4]))?)(\s?,\s?)?)+

编码愉快!如果您有任何问题,请发表评论。

【讨论】:

  • ([1-5]?[0-9])|(6[0-4])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多