在比赛前显示所有内容

时间:2012-03-27 06:06:23

标签: ruby

我有一个正则表达式,可以在我的驱动器上找到电视剧文件

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 个答案:

答案 0 :(得分:3)

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 :(得分:1)

尝试使用$`特殊变量:

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.

答案 2 :(得分:0)

在模式前使用#match.*一起使用捕获组。

"Lie.To.Me-S02E01-Xvid.avi".match(/\A(.*?)S\d+E\d+?/ix)[1]
# => Lie.To.Me-

答案 3 :(得分:0)

使用pre_match:

match = /S\d+?E\d+?/ix.match(filename)
if match then
  puts match.pre_match
end

答案 4 :(得分:0)

你应该在正则表达式中使用圆括号来处理组: if(filename =〜/ .+(S\d+?E\d+?).*/ix)   把“EPISODE:\ 1” 这意味着只会显示匹配的第一个组。