【问题标题】:Split string on the last occurrence of some character在某个字符的最后一次出现处拆分字符串
【发布时间】:2014-01-21 04:45:10
【问题描述】:

我基本上是在尝试拆分最后一个时期的字符串以捕获文件扩展名。但是有时该文件没有任何扩展名,所以我很期待。

但问题是某些文件名在结尾之前有句点...

/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);

如何在文件扩展名处拆分字符串,但在文件没有扩展名时也能够处理和警告。

【问题讨论】:

标签: java android regex string


【解决方案1】:

如何使用句点作为分隔符来拆分 filPath。并获取该数组中的最后一项以获取扩展名:

        String fileTypeArray[] = filePath.split(",");
        String fileType = "";
        if(fileTypeArray != null && fileTypeArray.length > 0) {
          fileType = fileTypeArray[fileTypeArray.length - 1];
        }

【讨论】:

    【解决方案2】:

    你可以试试这个

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

    【讨论】:

    • 请注意,这会将拆分字符留在最后一个字符串部分的开头。
    【解决方案3】:

    假设以点结尾并后跟字母数字字符的文件具有扩展名可能更容易。

    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 */ }
    

    请参阅the Java docs 了解正则表达式模式。记住要转义反斜杠,因为模式字符串需要反斜杠。

    【讨论】:

    • \w 元字符用于查找单词字符w3schools.com/jsref/jsref_regexp_wordchar.asp
    • 请注意,对于名称以点开头且没有扩展名的文件(例如.gitignore),这将失败,这在基于 POSIX 的系统上很常见。这可以通过更改if 条件以检查p 是否小于 等于零来解决。
    【解决方案4】:

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

    例如:

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

    输出:

    ccc.txt
    

    【讨论】:

    • 为了解析名称而构建 File 对象的成本太高
    • 认真@jasmeet?除了解析名称之外,文件不会做任何事情。您可能调用的某些方法可能很昂贵,但构造函数非常便宜。
    • 这应该是公认的答案。您也可以调用 f.getParent() 来获取路径部分。
    • 不,这绝对不应该是公认的答案,请阅读问题的第一行:“我基本上是在尝试拆分最后一个时期的字符串以捕获文件扩展名。”跨度>
    【解决方案5】:

    您可以在您的正则表达式中使用positive lookahead 以确保它仅在最后一次出现时拆分。正向前瞻确保它只在字符串后面没有看到另一个匹配项时才拆分。

    // 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"
    // ]
    

    分解正则表达式:

    • \\. - 找句号
    • (?=[^.]*$) - 确保后面的所有内容不是句号,不包括在比赛中)

    【讨论】:

      猜你喜欢
      • 2017-04-29
      • 2019-01-06
      • 1970-01-01
      • 2014-01-12
      • 2017-02-23
      • 2020-09-17
      • 1970-01-01
      • 2022-01-25
      • 2022-06-18
      相关资源
      最近更新 更多