拡張子の取り除き方
androidではあまり使う機会はないかもしれませんが、 応用できるので、使用経験があまりない方も知っておいて損はないかと思います。
拡張子を取り除く方法について、 ネットを調べると、splitやlastIndexOfを用いた方法がたくさんヒットするのですが、 これって実は、ディレクトリに拡張子が付いていると正しく動作しないことがあります。
なので、別のアプローチで拡張子を除外してみました。
val regex = Regex("""\.[^./\\]+$""") println("""aaa\bbb.txt""".replaceFirst(regex,"")) println("""aaa\bbb.ccc.txt""".replaceFirst(regex,"")) println("""aaa.dir\bbb.txt""".replaceFirst(regex,"")) println("""aaa.dir\bbb""".replaceFirst(regex,"")) println("""aaa\bbb""".replaceFirst(regex,""))
実行結果です。
aaa\bbb aaa\bbb.ccc aaa.dir\bbb aaa.dir\bbb aaa\bbb
ファイルに拡張子がなくても、ディレクトリに拡張子があっても、正しく動作しました。
正規表現って、perlのプログラムではとてもたくさん登場する便利な機能なのですが、 JavaやC++のサンプルでは、あまり登場しませんね。
私もRegexはどのメソッド使えばいいか覚えられていないので、使い辛いです。
正規表現の説明
\.
ドット文字(ドットのみだと一文字と言う意味になるので)
\\
バックスラッシュ(または円サイン)
[^a-z]+
指定された文字を含まない文字列と言う意味
$
行末(または文末)
\.[^./\\]+$
ディレクトリを含まない最後のドット以降と言う意味