如何在Erlang中从文件名字符串获取扩展名(支持文件名含多圆点)
在Erlang中从文件名获取扩展名(支持含多个圆点的场景)
好问题!处理带多个圆点的文件名其实很常见,比如你提到的This.Great.Image.jpg,在Erlang里有两种靠谱的方法可以搞定这个需求,我来一步步说明:
方法一:借助标准库filename模块(推荐)
Erlang的filename模块专门用于处理文件路径和文件名,它已经帮我们考虑了各种边界情况(比如带路径的文件名、不同操作系统的路径格式),用它来获取扩展名最稳妥。
filename:extension/1函数会返回带前置圆点的扩展名,如果文件名没有扩展名则返回空字符串。我们只需要去掉前置的圆点就能得到纯扩展名:
get_file_ext(Filename) -> case filename:extension(Filename) of "" -> ""; Ext -> string:substr(Ext, 2) % 移除开头的圆点 end.
测试几个场景:
get_file_ext("This.Great.Image.jpg")→ 返回"jpg"get_file_ext("/home/user/Documents.Report.pdf")→ 返回"pdf"get_file_ext("README")→ 返回""get_file_ext(".bashrc")→ 返回""(符合隐藏文件无扩展名的常规认知)get_file_ext("file..txt")→ 返回"txt"
方法二:手动字符串处理
如果你想了解底层实现逻辑,也可以用字符串操作找到最后一个圆点的位置,再截取后面的内容:
get_file_ext(Filename) -> case string:rstr(Filename, ".") of 0 -> ""; % 没有找到圆点,无扩展名 Pos -> % 检查圆点是否在开头(比如隐藏文件) if Pos =:= 1 -> ""; true -> string:substr(Filename, Pos + 1) end end.
这个方法的核心是string:rstr/2,它会返回字符串中最后一个匹配圆点的索引。我们额外加了判断,如果圆点在第一个位置(比如.gitignore),就返回空字符串,避免把隐藏文件名当成扩展名。
总结
优先用filename模块的方法,因为它是Erlang官方提供的工具,能处理更多你没考虑到的边缘情况,代码也更简洁易维护。
内容的提问来源于stack exchange,提问作者Jon Riel
相关产品推荐
相关产品推荐

