2017-02-17 18 views
1

Я нашел это из кода вызов:

def time_correct(t) 
    return unless t =~ /^\d{2}(:\d{2}){2}$/ 
end 

он используется для выяснить, например "0;:44:07" является обычной строкой времени ("HH:MM:SS") или нет. Хотя я не понимаю регулярное выражение. Может кто-нибудь объяснить мне /^\d{2}(:\d{2}){2}$/? Благодаря!

+0

regex101.com хороший ресурс, чтобы узнать и понять, регулярное выражение. См. [This] (https://regex101.com/r/WIH7FL/1). Проверьте раздел ОБЪЯСНЕНИЕ в правом верхнем углу. – Tushar

+0

Помимо обычного выражения, может ли этот метод вернуть что-либо, кроме 'nil'? Обратите внимание, что регулярное выражение соответствует '' 99: 99: 99'', хотя это недействительное время. Каков URL-адрес «проблемы с кодом», которую вы упоминаете? –

+0

'def time_correct (t) return t if t.nil? || t.empty? return, если t = ~/^ \ d {2} (: \ d {2}) {2} $/ t = t.split (":"). Map (&: to_i) Time.at (t [0] * 3600 + t [1] * 60 + t [2]).strftime "% H:% M:% S" end' это полный код. Я только копировал и вставлял строку, которую я не совсем понял. – Chaoguo0

ответ

3

На /^\d{2}(:\d{2}){2}$/:

  1. /.../ разделителей регулярное выражение выражение.
  2. ^ соответствует началу строки, если в многолинейном режиме или в начале строки в противном случае.
  3. \d матчи одна цифра
  4. {2} утверждает, что предыдущее заявление \d должно соответствовать 2 раза.
  5. (...) разделители группы захвата. Он объединяет вещи как обычную математическую концепцию, а также позволяет вам ссылаться на них последним, используя \i, где i является индексом группы. Пример, (а) (б), a является группой 1 и b является группа 2.
  6. \d{2} просто объяснено на ступенях 3 и 4.
  7. {2} то же, что и на этапе 4, но здесь предшествует группа захвата (:\d{2}), которая также должна повторяться 2 раза.
  8. $ соответствует концу строки, если в многострочном режиме или в конце строки в противном случае.

Если режим многоканальной линии включен, ваше выражение соответствует только таким вещам, как:

22:33:44 
02:33:44 

Но не как

22:33:44 d 
d 22:33:44 
f 02:33:44 f 

Если многоканальная линия не включена, ваше выражение только соответствует строке, содержащей действительное выражение как:

22:33:44 

Но ничего, на шнурке с двумя действующими линиями:

22:33:44 
02:33:44 

Это ссылка для живого тестирования: https://regex101.com/r/cdSdt4/1

Смежные вопросы