Соответствие регулярному выражению не проверяется правильно

#regex #preg-match

Вопрос:

У меня есть следующее регулярное выражение ^(2[0-3]|1?[0-9])?(:[0-5]?[0-9])?$

8:45 совпадений, однако 08:45 , нет.

Как это можно переписать, чтобы также разрешить 08:45 ?


Я также хотел бы проверить наличие . или : , если возможно, вместо просто .

Комментарии:

1. Что вы имеете в виду вместо просто . ? Ты не позволяешь дот сейчас! Вы имели в виду, что хотели бы разрешить точку, а также двоеточие в качестве разделителя?

2. я сделал да, я сделал :?. и это, кажется, делает свое дело

3. Я думаю, ты хочешь [.:] вместо : этого . Обратите внимание, что вам не нужно избегать двоеточий — они не имеют специального значения регулярных выражений.

Ответ №1:

Помимо «1», также разрешайте «0» в начале часов до «20:00».:

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

Обратите внимание, что вам не нужно избегать двоеточий — они не имеют специального значения регулярных выражений.

Кроме того, поскольку все является необязательным, это регулярное выражение соответствует пустой строке.

Если вы хотите что-то сопоставить, добавьте (?!$) после ^ . ^(?!$) это отрицательный взгляд вперед, привязанный к началу, который требует, чтобы конец ввода не следовал за началом ввода (т. Е. Ввод не имеет нулевой длины).

Ответ №2:

Пожалуйста, попробуйте это регулярное выражение.

[0]?d[:.]dd

который может захватывать 8:45 08:45 8.45 и 08.45

или нажмите на эту кнопку, чтобы увидеть результат.

https://regex101.com/r/tLEqhH/1

Комментарии:

1. Я бы предпочел сохранить существующее регулярное выражение, которое у меня есть

2. Это не совпадает 12:34 , но совпадает 00:99