2015-08-21 4 views
0
matchData = Regexp.new(/\d{4}-\d{2}-\d{2}\D\d{2}:\d{2}:\d{2}\D/) 


puts matchData.match("2015-08-21T13:54:29Z") 

if (!matchData || (matchData.size==0)) 
puts "here" 
end 

У меня есть формат даты, который я пытаюсь проверить, если он возвращает нуль или нет. Прямо сейчас это соответствует тому, что я хочу, чтобы он соответствовал, однако, когда он не соответствует (формат даты), я не могу найти то, что он возвращает. Это просто пусто, но это не ноль. Есть ли способ, который я могу использовать для проверки длины?Посмотрите, не возвращается ли регулярное выражение в Ruby

ответ

3

Если вы просто хотите проверить на матч, вы можете сделать это следующим образом:

if "string" =~ /regex/ 
    # do something 
end 

О том, почему ваш пример не работает: то, что вы назвали matchData является регулярное выражение, и вы никогда не сохранили ссылку до фактического MatchData. То, что ты хотел сказать:

regex = Regexp.new(/\d{4}-\d{2}-\d{2}\D\d{2}:\d{2}:\d{2}\D/) 
matchData = regex.match("2015-08-21T13:54:29Z") 

puts "here" unless matchData 
0

Если я правильно понимаю ваш вопрос, вы должны использовать DateTime::strptime (вместо регулярных выражений):

require 'date' 

dt = DateTime.strptime('2015-08-21T13:54:29Z', '%Y-%m-%dT%H:%M:%S%z') 
    #=> #<DateTime: 2015-08-21T13:54:29+00:00 ((2457256j,50069s,0n),+0s,2299161j)> 

Это не только сказать, содержит ли строка дата и время в указанном формате (если он не делает, strptime поднимает ArgumentError: invalid date исключение, которое вы бы rescue), но если это делает синтаксический анализ даты и времени элементов делается для вас:

d = dt.to_date 
    #=> #<Date: 2015-08-21 ((2457256j,0s,0n),+0s,2299161j)> 
d.year #=> 2015 
d.month #=> 8 
d.day #=> 21 
d.wday #=> 5 

t = dt.to_time 
    #=> 2015-08-21 06:54:29 -0700 
t.hour #=> 6 
t.min #=> 54 
t.sec #=> 29 
Смежные вопросы