无法使 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 次,并在它们之间使用连字符或斜杠)
您可以编写交替,如果您想保留所有捕获组,例如:
^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 后跟数字模式)
关闭非捕获组$
字符串结束