Не пишите свой собственный код для этого, используйте собственный встроенный код Ruby:
File.extname("test.rb") # => ".rb"
File.extname("a/b/d/test.rb") # => ".rb"
File.extname(".a/b/d/test.rb") # => ".rb"
File.extname("foo.") # => "."
File.extname("test") # => ""
File.extname(".profile") # => ""
File.extname(".profile.sh") # => ".sh"
В некоторых случаях вы пропускаете. Сравните вышеприведенное с результатами ваших попыток:
fnames = %w[
test.rb
a/b/d/test.rb
.a/b/d/test.rb
foo.
test
.profile
.profile.sh
]
fnames.map { |fn|
fn.match(/\.(\w*)/).to_s
}
# => [".rb", ".rb", ".a", ".", "", ".profile", ".profile"]
fnames.map { |fn|
fn.scan(/\.(\w*)/).to_s
}
# => ["[[\"rb\"]]",
# "[[\"rb\"]]",
# "[[\"a\"], [\"rb\"]]",
# "[[\"\"]]",
# "[]",
# "[[\"profile\"]]",
# "[[\"profile\"], [\"sh\"]]"]
В документации для File.extname написано:
Возвращает расширение (часть файла имя в path
, начиная с последнего периода).
Если path
является точечным файлом или начинается с периода, то начальная точка не имеет отношения к началу расширения.
Пустая строка также будет возвращена, когда точка является последним символом в path
.
В Windows, конечные точки усекаются.
Класс File имеет много других полезных методов для разделения имен файлов. Также есть класс Pathname , который очень полезен для подобных вещей.