使用条件正则表达式从url生成文件名

时间:2014-03-15 16:39:22

标签: ruby regex

如何获取以下字符串以输出以下内容?

regex = '' # help me out here guys!

'baz/foobaryfobar/'.match(regex) #=> foobaryfobar

'baz/foobar'.match(regex) #=> foobar

'baz/foobar.jpg'.match(regex) #=> foobar

'baz/foobar.png'.match(regex) #=> foobar

'baz/foobar.gif'.match(regex) #=> foobar

'baz/foobar.jpeg'.match(regex) #=> foobar

可以用一个正则表达式完成吗?

更新

非正则表达式解决方案非常受欢迎!

2 个答案:

答案 0 :(得分:3)

如果没有正则表达式,但使用extnamebasename

def gen_file_name(string)
  File.basename(string,File.extname(string))
end

gen_file_name('baz/foobar.jpg') # => "foobar"
gen_file_name("baz/foobaryfobar/") # => "foobaryfobar"
gen_file_name('baz/foobar') # => "foobar"

答案 1 :(得分:0)

不确定约束,但可能是其中一个

如果点可能属于file.name.ext之类,则说明点在您的描述中存在问题 否则,

获取捕获组1中的文件名 -

 # ([^/.]+)(?:\.[^/.]*|/)?\s*$

 ( [^/.]+ )       # (1)
 (?:
      \. [^/.]* 
   |  /  
 )?
 \s* 
 $

这使用了lookahead,匹配是文件名 -

 # [^/.]+(?=(?:\.[^/.]*|/)?\s*$)

 [^/.]+ 
 (?=
      (?:
           \. [^/.]* 
        |  /  
      )?
      \s* 
      $ 
 )

Perl测试用例

my @ary = (
'baz/foobaryfobar/',
'baz/foobar',
'baz/foobar.jpg',
'baz/foobar.png',
'baz/foobar.gif',
'baz/foobar.jpeg'
);


for $url ( @ary )
{
      if ( $url =~ /[^\/.]+(?=(?:\.[^\/.]*|\/)?\s*$)/ ) {
           print "matched:  $&\n";
      }
}

输出>>

matched:  foobaryfobar
matched:  foobar
matched:  foobar
matched:  foobar
matched:  foobar
matched:  foobar