在某个字符的最后一个出现位置上分割字符串

42
我基本上是想通过在最后一个点上分割字符串来捕获文件扩展名。但是有时候文件没有任何扩展名,所以我预料到这种情况。
但问题是一些文件名在结尾前有点号,像这样...
/mnt/sdcard/OG Ron C, Chopstars & Drake - Choppin Ain't The Same-2013-MIXFIEND/02 Drake - Connect (Feat. Fat Pat) (Chopped Not Slopped).mp3

所以当这个字符串出现时,它会在“02 Drake - Connect (Feat.”处截断。

这是我一直在使用的...

String filePath = intent.getStringExtra(ARG_FILE_PATH);
String fileType = filePath.substring(filePath.length() - 4);
String FileExt = null;
try {
    StringTokenizer tokens = new StringTokenizer(filePath, ".");
    String first = tokens.nextToken();
    FileExt = tokens.nextToken();
}
catch(NoSuchElementException e) {
    customToast("the scene you chose, has no extension :(");
}
System.out.println("EXT " + FileExt);
File fileToUpload = new File(filePath);

如何在文件扩展名处拆分字符串,同时也能处理并警报没有扩展名的文件。


3
考虑使用lastIndexOf()函数,结合一些启发式方法来判断它是表示文件名的一部分还是表示文件扩展名。 - laalto
1
请参见以下链接:https://dev59.com/E3A65IYBdhLWcg3w5zHB - Qtax
为什么不将字符串反转并取出第一个'.'之前的子字符串呢? - Alessio
1
也许这个链接可以帮助你:https://dev59.com/UW445IYBdhLWcg3wXZO9 - Meenal
7个回答

67

你可以尝试这个

int i = s.lastIndexOf(c);
String[] a =  {s.substring(0, i), s.substring(i)};

19
请注意,这会在最后一个字符串部分的开头保留分割字符。 - 1615903
6
确切的答案应该是:int i = s.lastIndexOf(c); String[] a = {s.substring(0, i), s.substring(i + 1)}; - Jose Duarte

34

假设以点(.)和字母数字字符结尾的文件具有扩展名可能会更容易些。

int p=filePath.lastIndexOf(".");
String e=filePath.substring(p+1);
if( p==-1 || !e.matches("\\w+") ){/* file has no extension */}
else{ /* file has extension e */ }

请参考 Java 文档了解正则表达式的模式。请记得转义反斜杠,因为模式字符串需要反斜杠。


1
\w元字符用于查找单词字符。http://www.w3schools.com/jsref/jsref_regexp_wordchar.asp - Alessio
请注意,这将在文件名以点开头且没有扩展名的文件上失败(例如 .gitignore),这在基于 POSIX 的系统上非常普遍。可以通过更改“if”条件来检查“p”是否小于等于零来解决此问题。 - Mac

6

这是Java吗?如果是,为什么不使用"java.io.File.getName"。

例如:

File f = new File("/aaa/bbb/ccc.txt");
System.out.println(f.getName());

输出:

ccc.txt

4
建立一个文件对象来解析名称太昂贵了。 - Jasmeet Singh
认真的吗,@jasmeet?文件在底层除了解析名称之外什么也不做;你可能会调用一些昂贵的方法,但构造函数非常便宜。 - John Calcote
这应该是被接受的答案。您还可以调用f.getParent()来获取路径部分。 - John Calcote
1
不应该接受此答案,首先请读问题中的第一行:“我基本上想要在最后一个句点处拆分字符串以捕获文件扩展名。” - h00ligan

3
您可以在正则表达式中使用正向先行断言来确保它仅在最后一个出现的情况下拆分。 正向先行断言确保仅在字符串中不再看到另一个出现时才进行拆分。
// Using example filePath from question
String filePath = "/mnt/sdcard/OG Ron C, Chopstars & Drake - Choppin Ain't The Same-2013-MIXFIEND/02 Drake - Connect (Feat. Fat Pat) (Chopped Not Slopped).mp3";
String[] parts = filePath.split("\\.(?=[^.]*$)");
// parts = [
//     "/mnt/sdcard/OG Ron C, Chopstars & Drake - Choppin Ain't The Same-2013-MIXFIEND/02 Drake - Connect (Feat. Fat Pat) (Chopped Not Slopped)"
//     "mp3"
// ]

分解正则表达式:

  • \\. - 查找句点
  • (?=[^.]*$) - 确保后面的所有内容不是句点,但不包括在匹配中

2
您可以使用Apache Commons中的StringUtils,这是一种优雅的提取文件类型的方法。
    String example = "/mnt/sdcard/OG Ron C, Chopstars & Drake - Choppin Ain't The Same-2013-MIXFIEND/02 Drake - Connect (Feat. Fat Pat) (Chopped Not Slopped).mp3";
    String format = StringUtils.substringAfterLast(example, ".");
    System.out.println(format);

程序将在控制台打印"mp3"。


1
使用句点作为分隔符来拆分filPath,然后获取该数组中的最后一项以获取扩展名:
        String fileTypeArray[] = filePath.split(",");
        String fileType = "";
        if(fileTypeArray != null && fileTypeArray.length > 0) {
          fileType = fileTypeArray[fileTypeArray.length - 1];
        }

0

对于任意长度的分隔字符串c

int i = s.lastIndexOf(c); 
String[] a =  {s.substring(0, i), s.substring(i+c.length())};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接