我正在创建一个正则表达式,可以匹配 VALID TIL|UNTIL ddhhmm 或 VALID ddhhmm/ddhhmm

问题描述 投票:0回答:1

无法使 REGEX 模式匹配工作。

此正则表达式模式

^VALID(?: (?:TIL|UNTIL) \d{6}| \d{6}[-\/]\d{6})
匹配

VALID 222200/222300
VALID 222200-222300
VALID TIL 222200
VALID UNTIL 222200

但它也匹配(这些时间对于 ddhhmm 无效):

VALID 123456/789012
VALID 123456-789012
VALID TIL 123456
VALID UNTIL 123456

我尝试更正以下内容,但不起作用:

^VALID(?: (?:TIL|UNTIL) ([012]\d|[3][01])([01][0-9]|[2][0-3])([0-5]\d{1})[-\/]([012]\d|[3][01])([01][0-9]|[2][0-3])([0-5]\d{1}))

寻找: VALID 位于行首,后跟可选的 TIL 或 UNTIL dd 0,1,2 后跟任意数字或 3 后跟 0 或 1 hh 0 或 1 后跟 0 到 9 或 a 2 后跟 0 到 3 mm 0 到 5 后跟任意数字 “-|/”连字符或斜杠 dd 0,1,2 后跟任意数字或 3 后跟 0 或 1 hh 0 或 1 后跟 0 到 9 或 a 2 后跟 0 到 3 mm 0 到 5 后跟任意数字

上述正则表达式会正确返回 ddhhmm 的值,但当 TIL 或 UNTIL 存在时,应该只需要 1 次。

VALID TIL 222200-222300 
VALID UNTIL 222200/222300

但不匹配

VALID 222200-222300  不存在 TIL 或 UNTIL 将有两次 ddhhmm/ddhhmm 或 ddhhmm-ddhhmm

这可以在单个正则表达式中完成吗(如果 TIL 或 UNTIL 存在,则仅解析 1 次,如果不存在,则解析 2 次,并在它们之间使用连字符或斜杠)

regex-group
1个回答
0
投票

您可以编写交替,如果您想保留所有捕获组,例如:

^VALID (?:([012]\d|3[01])([01][0-9]|[2][0-3])([0-5]\d)[\/-]([012]\d|3[01])([01][0-9]|[2][0-3])([0-5]\d)|(?:UN)?TIL ([012]\d|3[01])([01][0-9]|[2][0-3])([0-5]\d))$

模式匹配:

  • ^
    字符串开头
  • VALID 
    按字面意思匹配
  • (?:
    2 个替代方案的非捕获组
    • ([012]\d|3[01])([01][0-9]|[2][0-3])([0-5]\d)[\/-]([012]\d|3[01])([01][0-9]|[2][0-3])([0-5]\d)
      匹配 2 倍的数字模式,中间有
      -
      /
    • |
      或者
    • (?:UN)?TIL ([012]\d|3[01])([01][0-9]|[2][0-3])([0-5]\d)
      匹配 UNTIL 或 TIL 后跟数字模式
  • )
    关闭非捕获组
  • $
    字符串结束

正则表达式演示

© www.soinside.com 2019 - 2024. All rights reserved.