用于匹配只需要以有效序列开头的模式的正则表达式

Regex for matching a pattern which only needs to start with a valid sequence start

我这里有这个正则表达式模式 /^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/。它用于验证 HH:MM 带有可选前导零的 24 小时制字符串。

但是,例如,当我将它与字符串 23:59 进行匹配时,它起作用了。这是好事。但我还想匹配这些字符串:22323:23:523:59。经过几个小时的调试,我仍然找不到这样的东西,如果它存在的话。

(如果它有用,我正在使用 Objective-C 正则表达式引擎,或者我也可以选择使用 Swift 正则表达式引擎。)

看起来以下方法可行:

^(?:[01]?[0-9]|2[0-3])(?::(?:[0-5]?[0-9])?)?$

在线查看demo

  • ^ - 开始字符串锚点。
  • (?: - 打开第一个非捕获组:
    • [01]? - 可选零或一;
    • [0-9] - 任何数字;
    • | - 或者:
    • 2[0-3] - 一个二后跟一个从零到三的数字;
    • ) - 关闭第一个非捕获组。
  • (?: - 打开第二个非捕获组:
    • : - 一个冒号;
    • (?: - 打开第三个非捕获组:
      • [0-5]?[0-9] - 可选数字从零到五和数字从零到九;
      • )? - 关闭第 3 个非捕获组并将其设为可选。
    • )? - 关闭第二个非捕获组并使其可选。
  • $ - 结束字符串锚点。

您可以用数字 00-23 开始匹配,或者将所有分钟部分设为可选。

^(?:[01]?[0-9]|2[0-3])(?::(?:[0-5][0-9]?)?)?$

说明

  • ^ 字符串开头
  • (?:非捕获组
    • [01]?[0-9] 匹配 00 - 19 或 0-9
    • |
    • 2[0-3] 匹配 20-23
  • ) 关闭群组
  • (?:非捕获组
    • :匹配一个:字符
    • (?:[0-5][0-9]?)? 可选匹配 5 和可选数字 0-9
  • )? 关闭组并使其可选
  • $ 字符串结束

Regex demo