正则表达式接受数字 and/or 以逗号分隔的数字范围,但范围在 1-64 之间

Regex to accept numbers and/or number range separated by commas, but between range 1-64

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

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

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

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

[1-6]?[0-9]

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

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

编辑

这里我手动输入了 spaces 和逗号加上一个“?”紧随其后(出现一次或根本不出现),如果您允许多个 space,请更改相关的“?”到 "*" 我不能 100% 保证这会奏效,但逐步构建它,我相信它会奏效。

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

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

编辑2

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

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

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

给你,

^(?: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 而不是 space。如果要允许可选的 space 不是零个或多个 space,请使用 \s? 而不是 <space>*

DEMO

这应该匹配 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*))+$