如何获取以下字符串以输出以下内容?
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
可以用一个正则表达式完成吗?
更新
非正则表达式解决方案非常受欢迎!
答案 0 :(得分:3)
如果没有正则表达式,但使用extname
,basename
?
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