【问题标题】:Regex for validate string of int range用于验证 int 范围字符串的正则表达式
【发布时间】: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|$)

【问题讨论】:

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

标签: javascript c# regex


【解决方案1】:

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

使用这个:

^(?:181[0-6]|180\d|1[0-7]\d{2}|[1-9]|\d{2,3})(?:-(?:181[0-6]|180\d|1[0-7]\d{2}|[1-9]|\d{2,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),如果您不使用捕获,您不必关心他们正在捕获。
    猜你喜欢
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多