Показать все перед матчем - PullRequest
0 голосов
/ 27 марта 2012

У меня есть регулярное выражение для поиска файлов сериалов на моем диске

if (filename =~ /S\d+?E\d+?/ix)
  puts "EPISODE : #{filename}" 

работает достаточно хорошо и печатает имя файла, например,

EPISODE : Lie.to.Me.S02E02.Truth.or.Consequences.HDTV.XviD-2HD.avi

Как я могуотображать все до совпадения, а не все имя файла?Поэтому я хочу сопоставить на S02E02, но отобразить Lie.to.Me, но эта строка Lie.to.Me действительно может быть чем угодно, поэтому я не могу сделать регулярное выражение для чего-то конкретного.

Ответы [ 5 ]

3 голосов
/ 27 марта 2012
s = "Lie.to.Me.S02E02.Truth.or.Consequences.HDTV.XviD-2HD.avi"
m = s.match(/S\d+?E\d+?/ix)
puts m.pre_match
=> "Lie.to.Me."
1 голос
/ 27 марта 2012

Попробуйте использовать специальную переменную $`:

def check(filename)
  if (filename =~ /S\d+?E\d+?/ix)
    puts "MATCH: #{filename}" 
    puts "PRE: #{$`}"
  end
end
check 'EPISODE : Lie.to.Me.S02E02.Truth.or.Consequences.HDTV.XviD-2HD.avi'
# MATCH: EPISODE : Lie.to.Me.S02E02.Truth.or.Consequences.HDTV.XviD-2HD.avi
# PRE: EPISODE : Lie.to.Me.
0 голосов
/ 27 марта 2012

вы должны позаботиться об использовании скобок в регулярном выражении, чтобы иметь возможность обрабатывать группы: if (filename = ~ /.+(S\d+?E\d+?).*/ix) ставит "ЭПИЗОД: \ 1" Это означает, что будет отображаться только первая соответствующая группа.

0 голосов
/ 27 марта 2012

Использовать pre_match:

match = /S\d+?E\d+?/ix.match(filename)
if match then
  puts match.pre_match
end
0 голосов
/ 27 марта 2012

Используйте #match с .* перед вашим шаблоном, с группой захвата.

"Lie.To.Me-S02E01-Xvid.avi".match(/\A(.*?)S\d+E\d+?/ix)[1]
# => Lie.To.Me-
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...