जावा में प्रत्यय ट्रिम करने का सबसे कुशल तरीका क्या है:
title part1.txt
title part2.html
=>
title part1
title part2
जावा में प्रत्यय ट्रिम करने का सबसे कुशल तरीका क्या है:
title part1.txt
title part2.html
=>
title part1
title part2
जवाबों:
यह एक ऐसा कोड है जिसे हमें स्वयं नहीं करना चाहिए। सांसारिक सामान के लिए पुस्तकालयों का उपयोग करें, कठिन सामान के लिए अपने मस्तिष्क को बचाएं।
इस मामले में, मैं Apache Commons IO से FilenameUtils.removeExtension () का उपयोग करने की सलाह देता हूं
str.substring(0, str.lastIndexOf('.'))
if(str.contains("."))
str.substring(0, str.lastIndexOf('.'))
का उपयोग कर के रूप में String.substring
और String.lastIndex
एक एक लाइनर अच्छा है में, वहाँ कुछ फ़ाइल पथ के साथ सामना करने में सक्षम होने के मामले में कुछ मुद्दे हैं।
उदाहरण के लिए निम्न पथ लें:
a.b/c
वन-लाइनर का उपयोग करने के परिणामस्वरूप होगा:
a
यह गलत है।
परिणाम होना चाहिए था c
, लेकिन चूंकि फ़ाइल में एक्सटेंशन का अभाव था, लेकिन पथ में निर्देशिका के साथ .
नाम था, एक-लाइनर विधि को फ़ाइल नाम के रूप में पथ का हिस्सा देने के लिए ट्रिक किया गया था, जो सही नहीं है।
जाँच की आवश्यकता है
Skaffman के जवाब से प्रेरित होकर , मैंने Apache Commons IO की FilenameUtils.removeExtension
विधि पर एक नज़र डाली ।
इसके व्यवहार को फिर से बनाने के लिए, मैंने कुछ परीक्षण लिखे जिन्हें नई विधि को पूरा करना चाहिए, जो निम्नलिखित हैं:
पथ का नाम -------------- -------- a / b / सीसी a / b / c.jpg c a / b / c.jpg.jpg c.jpg ab / सीसी ab / c.jpg c ab / c.jpg.jpg c.jpg सीसी c.jpg सी 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
उपरोक्त परीक्षणों के साथ इस विधि को चलाने से ऊपर सूचीबद्ध परिणाम मिलते हैं।
विधि का परीक्षण निम्न कोड के साथ किया गया था। जैसा कि यह विंडोज़ पर चलाया गया था, पथ विभाजक वह है \
जिसे \
एक 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
परिणाम वांछित परिणाम हैं जो परीक्षण में उल्लिखित विधि को पूरा करना चाहिए।
System.getProperty("file.separator")
और न कि बस File.separator
?
/path/to/.htaccess
BTW, मेरे मामले में, जब मैं एक विशिष्ट विस्तार को हटाने के लिए एक त्वरित समाधान चाहता था, यह लगभग यही है जो मैंने किया था:
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('.'));
com.google.common.io.Files
यदि आपकी परियोजना पहले से Google कोर लाइब्रेरी पर निर्भर है, तो कक्षा में एक विधि का उपयोग करें । जिस विधि की आपको आवश्यकता है getNameWithoutExtension
।
मुझे कूलबर्ड का उत्तर विशेष रूप से उपयोगी लगा।
लेकिन मैंने अंतिम परिणाम बयानों को बदल दिया:
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" और नहीं "परीक्षा"
एक regex का उपयोग करें। यह एक अंतिम बिंदु और उसके बाद सब कुछ बदल देता है।
String baseName = fileName.replaceAll("\\.[^.]*$", "");
आप एक पैटर्न ऑब्जेक्ट भी बना सकते हैं, यदि आप regex को प्री-कंपाइल करना चाहते हैं।
स्ट्रिंग छवि पथ के साथ एक नई फ़ाइल बनाएँ
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 = '\\';
मैं यह करना चाहूंगा:
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);
अंत तक '।' इसके बाद सबस्ट्रिंग को कॉल करें।
संपादित करें: एक गोल्फ नहीं हो सकता है लेकिन यह प्रभावी है :)
उन परिदृश्यों को ध्यान में रखते हुए जहाँ कोई फ़ाइल एक्सटेंशन नहीं है या एक से अधिक फ़ाइल एक्सटेंशन नहीं है
उदाहरण फ़ाइल नाम: फ़ाइल | 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 के लिए उदाहरण का आउटपुट देगा
public static String removeExtension(String file) {
if(file != null && file.length() > 0) {
while(file.contains(".")) {
file = file.substring(0, file.lastIndexOf('.'));
}
}
return file;
}
file.length() > 0
चेक किस उद्देश्य से कार्य करता है ?