次のように、Javaで接尾辞をトリムする最も効率的な方法は何ですか:
title part1.txt
title part2.html
=>
title part1
title part2
これは、自分でやるべきではない種類のコードです。ありふれたものにはライブラリを使用し、難しいものには頭脳を保存します。
この場合、 FilenameUtils.removeExtension() from Apache Commons IO を使用することをお勧めします
str.substring(0, str.lastIndexOf('.'))
ワンライナーでString.substring
とString.lastIndex
を使用するのが良いので、特定のファイルパスに対処できるという点でいくつかの問題があります。
たとえば、次のパスを取ります。
a.b/c
ワンライナーを使用すると、次の結果になります。
a
それは間違っています。
結果はc
になっているはずですが、ファイルには拡張子がなく、パスに名前に.
が含まれるディレクトリがあるため、ワンライナーメソッドは、パスの一部をファイル名として指定するようにtrickされました。
チェックが必要です
skaffman's answer に触発されて、 Apache Commons IO の FilenameUtils.removeExtension
メソッドを調べました。
その動作を再現するために、新しいメソッドが満たすべきいくつかのテストを作成しました。テストは次のとおりです。
パスファイル名 -------------- -------- a/b/cc a /b/c.jpg c a/b/c.jpg.jpg c.jpg ab/cc ab/c.jpg c ab/c.jpg.jpg c.jpg cc c.jpg c c.jpg.jpg c.jpg
(そして、私がチェックしたのはこれだけです。おそらく、私が見落としていた他のチェックがあるはずです。)
実装
removeExtension
メソッドの実装は次のとおりです。
public static String removeExtension(String s) {
String separator = System.getProperty("file.separator");
String filename;
// Remove the path upto the filename.
int lastSeparatorIndex = s.lastIndexOf(separator);
if (lastSeparatorIndex == -1) {
filename = s;
} else {
filename = s.substring(lastSeparatorIndex + 1);
}
// Remove the extension.
int extensionIndex = filename.lastIndexOf(".");
if (extensionIndex == -1)
return filename;
return filename.substring(0, extensionIndex);
}
上記のテストでこのremoveExtension
メソッドを実行すると、上記の結果が得られます。
メソッドは次のコードでテストされました。これはWindowsで実行されたため、パス区切り文字は\
であり、String
リテラルの一部として使用する場合は\
でエスケープする必要があります。
System.out.println(removeExtension("a\\b\\c"));
System.out.println(removeExtension("a\\b\\c.jpg"));
System.out.println(removeExtension("a\\b\\c.jpg.jpg"));
System.out.println(removeExtension("a.b\\c"));
System.out.println(removeExtension("a.b\\c.jpg"));
System.out.println(removeExtension("a.b\\c.jpg.jpg"));
System.out.println(removeExtension("c"));
System.out.println(removeExtension("c.jpg"));
System.out.println(removeExtension("c.jpg.jpg"));
結果は次のとおりです。
c
c
c.jpg
c
c
c.jpg
c
c
c.jpg
結果は、メソッドが満たすべきテストで概説された望ましい結果です。
ところで、私の場合、特定の拡張機能を削除するための迅速な解決策が必要な場合、これはほぼ私がやったことです:
if (filename.endsWith(ext))
return filename.substring(0,filename.length() - ext.length());
else
return filename;
String foo = "title part1.txt";
foo = foo.substring(0, foo.lastIndexOf('.'));
String fileName="foo.bar";
int dotIndex=fileName.lastIndexOf('.');
if(dotIndex>=0) { // to prevent exception if there is no dot
fileName=fileName.substring(0,dotIndex);
}
これはトリックの質問ですか? :p
私はより速い方法のATMを考えることができません。
filename.substring(filename.lastIndexOf('.'), filename.length()).toLowerCase();
coolbird's answer が特に便利だと思いました。
しかし、最後の結果ステートメントを次のように変更しました。
if (extensionIndex == -1)
return s;
return s.substring(0, lastSeparatorIndex+1)
+ filename.substring(0, extensionIndex);
絶対パス名が返されるようにしたかったため。
したがって、 "C:\ Users\mroh004.COM\Documents\Test\Test.xml"は "C:\ Users\mroh004.COM\Documents\Test\Test"になり、 "Testではありません「
プロジェクトが既にGoogleコアライブラリに依存している場合は、com.google.common.io.Files
クラスのメソッドを使用します。必要なメソッドはgetNameWithoutExtension
です。
正規表現を使用します。これは最後のドットとそれ以降のすべてを置き換えます。
String baseName = fileName.replaceAll("\\.[^.]*$", "");
正規表現をプリコンパイルする場合は、Patternオブジェクトを作成することもできます。
String[] splitted = fileName.split(".");
String fileNameWithoutExtension = fileName.replace("." + splitted[splitted.length - 1], "");
文字列画像パスで新しいファイルを作成します
String imagePath;
File test = new File(imagePath);
test.getName();
test.getPath();
getExtension(test.getName());
public static String getExtension(String uri) {
if (uri == null) {
return null;
}
int dot = uri.lastIndexOf(".");
if (dot >= 0) {
return uri.substring(dot);
} else {
// No extension.
return "";
}
}
org.Apache.commons.io.FilenameUtilsバージョン2.4は次の答えを与えます
public static String removeExtension(String filename) {
if (filename == null) {
return null;
}
int index = indexOfExtension(filename);
if (index == -1) {
return filename;
} else {
return filename.substring(0, index);
}
}
public static int indexOfExtension(String filename) {
if (filename == null) {
return -1;
}
int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);
int lastSeparator = indexOfLastSeparator(filename);
return lastSeparator > extensionPos ? -1 : extensionPos;
}
public static int indexOfLastSeparator(String filename) {
if (filename == null) {
return -1;
}
int lastUnixPos = filename.lastIndexOf(UNIX_SEPARATOR);
int lastWindowsPos = filename.lastIndexOf(WINDOWS_SEPARATOR);
return Math.max(lastUnixPos, lastWindowsPos);
}
public static final char EXTENSION_SEPARATOR = '.';
private static final char UNIX_SEPARATOR = '/';
private static final char WINDOWS_SEPARATOR = '\\';
private String trimFileExtension(String fileName)
{
String[] splits = fileName.split( "\\." );
return StringUtils.remove( fileName, "." + splits[splits.length - 1] );
}
あなたはこの機能を試すことができます、非常に基本的な
public String getWithoutExtension(String fileFullPath){
return fileFullPath.substring(0, fileFullPath.lastIndexOf('.'));
}
ファイル拡張子がない、または複数のファイル拡張子があるシナリオを念頭に置いてください
例Filename:file | file.txt | file.tar.bz2
/**
*
* @param fileName
* @return file extension
* example file.fastq.gz => fastq.gz
*/
private String extractFileExtension(String fileName) {
String type = "undefined";
if (FilenameUtils.indexOfExtension(fileName) != -1) {
String fileBaseName = FilenameUtils.getBaseName(fileName);
int indexOfExtension = -1;
while (fileBaseName.contains(".")) {
indexOfExtension = FilenameUtils.indexOfExtension(fileBaseName);
fileBaseName = FilenameUtils.getBaseName(fileBaseName);
}
type = fileName.substring(indexOfExtension + 1, fileName.length());
}
return type;
}
String img = "example.jpg";
// String imgLink = "http://www.example.com/example.jpg";
URI uri = null;
try {
uri = new URI(img);
String[] segments = uri.getPath().split("/");
System.out.println(segments[segments.length-1].split("\\.")[0]);
} catch (Exception e) {
e.printStackTrace();
}
これはimgとimgLinkの両方に対してexampleを出力します
public static String removeExtension(String file) {
if(file != null && file.length() > 0) {
while(file.contains(".")) {
file = file.substring(0, file.lastIndexOf('.'));
}
}
return file;
}
私はこれが好きです:
String title_part = "title part1.txt";
int i;
for(i=title_part.length()-1 ; i>=0 && title_part.charAt(i)!='.' ; i--);
title_part = title_part.substring(0,i);
最後まで「。」まで次に、部分文字列を呼び出します。
編集:ゴルフではないかもしれませんが、効果的です:)