用于验证 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 范围字符串的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章