用于验证 int 范围字符串的正则表达式

Posted

技术标签:

【中文标题】用于验证 int 范围字符串的正则表达式【英文标题】:Regex for validate string of int range 【发布时间】:2020-01-20 08:59:27 【问题描述】:

我正在尝试构建可以验证数字或范围输入的正则表达式。 允许的值为

1 到 1816 之间的任何数字 由 2 个数字组成的范围,用 - 分隔。每个数字必须介于 1 和 1816 之间。例如“1-1816”、“3-100”、“1815-1816”

无效值包括

“0” 负数(如“-13”) 前导零的数字(如“01”) 数字超出范围 1-1816(单独或作为范围的一部分)

任何正则表达式都可以是 javascript 或 C#。

到目前为止,我想通了

(?<=\s|^)\d+(?=\s|$)

【问题讨论】:

使用像(\d1,4)(-\d1,4)?这样的正则表达式从字符串中提取数字。在此之后将此数字解析为 int 并使用正常的if 语句检查它们的范围 【参考方案1】:

您的正则表达式的问题是您通过\d 接受所有数字,而不是限制它以适应您接受的范围。

使用这个:

^(?:181[0-6]|180\d|1[0-7]\d2|[1-9]|\d2,3)(?:-(?:181[0-6]|180\d|1[0-7]\d2|[1-9]|\d2,3))?$

此正则表达式将数字限制在 1-1816 范围内,同时支持单个数字或通过指定的连字符分隔符的范围。

Demo

【讨论】:

【参考方案2】:

这个正则表达式应该可以解决问题:

^([1-9][0-9]0,2|1[0-7][0-9]2|180[0-9]|181[0-6])(-([1-9][0-9]0,2|1[0-7][0-9]2|180[0-9]|181[0-6]))?$

基本上它允许

前导 1 和 0 到 2 位数字的数字 一个以 1 开头的数字,后跟 0-7 和任意数字的两倍 前导 180 后跟一个数字的数字 前导 181 后跟一个数字 0-6 的数字 这可以选择在之后再重复一次 -

但通常正则表达式不适用于数字(并且在数字更改时很难更新)。如果你有这样的选择,我宁愿通过更简单的正则表达式来验证数字,比如

^[1-9][0-9]0,3(-([1-9][0-9]0,3))?$

然后以编程方式将其拆分为 -(如果存在)并将各个段解析为整数并根据范围验证它们的数值。

这还允许您检查无效范围,例如 100-1、1800-1800 等。

【讨论】:

组不一定要捕获! 当然,捕获组更具可读性;-)。这是非捕获版本:^(?:[1-9][0-9]0,2|1[0-7][0-9]2|180[0-9]|181 [0-6])(?:-(?:[1-9][0-9]0,2|1[0-7][0-9]2|180[0-9] |181[0-6]))?$ 另一方面,简单的正则表达式可以像这样利用捕获组 ^([1-9][0-9]0,3)(?:-([1-9] [0-9]0,3))?$ 并且不需要用 - 分割,捕获的组可用于提取一个或两个匹配的数字 我认为我对捕获组的作用有相当的了解。但在这种情况下不需要它们,因为 OP 想要的只是匹配几个字符串,而不是捕获任何数据。 除了捕获(这里不那么相关)之外,捕获组还进行分组。如果你写abc有区别吗?和(ABC)? (ab 强制 + c 可选与整个字符串可选)。为什么我使用捕获组而不是非捕获组 - 捕获组更容易编写和读取 - 捕获 (abc);非捕获(?:abc),如果您不使用捕获,您不必关心他们正在捕获。

以上是关于用于验证 int 范围字符串的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

用于密码验证的正则表达式 [重复]

正则表达式用于一系列数字和一个用于验证的字符

用于密码验证的正则表达式,仅特定字符 [重复]

用于用户名验证的正则表达式

用于密码验证的正则表达式

用于密码验证的正则表达式 Java