正则表达式匹配数字大于或等于20,增量为5,范围为20到999

时间:2015-11-11 10:00:32

标签: regex

我一直在尝试解决以下问题:

  1. 匹配范围20至999
  2. 中的所有数字
  3. 增量为5
  4. 无小数点
  5. 大于或等于20。
  6. 经过研究得出以下结论:

    (?=^([2-9]\d|[1-9]\d{2,})$)(?=^\d*[05]$) 
    

    (奇怪的是,在我正在使用的正则表达式测试器中,表达式并不总是有效)。

    (?=^[2-9]\d+)(?=\d*[05]$)
    

    我认为这种情况下范围仅限于20到99.

    请帮忙吗?

2 个答案:

答案 0 :(得分:4)

假设字符串仅包含数字,并且不允许前导零:

^([2-9]|[1-9]\d)[05]$

构建正则表达式并不太难,只需考虑范围:

  • 从20增加到99,增量为5,此范围的正则表达式为[2-9][05]
  • 从100增加到999,增量为5,此范围的正则表达式为[1-9]\d[05]

在这种情况下相当容易,因为10或100的每个倍数中的所有有效值都在该范围内。

更难的情况的一个例子是25到260的范围,包括两端的增量为5.我们需要将其分解为以下范围,以减少为10s / 100s的倍数内的所有值写正则表达式的问题:

  • 值25
  • 范围从30到99:[3-9][05]
  • 范围从100到199:1\d[05]
  • 范围从200到250:2[0-5][05]
  • 值260

答案 1 :(得分:2)

试试这个:(\d{2}|[2-9])[05]
您的解决方案的问题是您不检查您是否有2位数或3位数字。

我的解决方案如下:

  • (<X>|<Y>) - 匹配X或Y(不是两者)
  • \d{2} - 正好2位数
  • [2-9] - 正好在2-9
  • 范围内的一位数字
  • [05] - “0”或“5”(乘以5)

作为一个整体,它表示“一个3位数字,或一个2位数字,其中第一个数字是2-9,最后一个数字是0或5”。

只要您没有前导零,这应该可以正常工作。在这种情况下,你需要一个前瞻,它会更复杂。