在某个字符的最后一次出现处拆分字符串

Posted

技术标签:

【中文标题】在某个字符的最后一次出现处拆分字符串【英文标题】: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);

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

【问题讨论】:

考虑使用lastIndexOf(),使用一些启发式方法来检测它何时表示“扩展名”以及何时是文件名的一部分。 见***.com/questions/3571223/… 为什么不反转字符串,取'.'之前的第一个子字符串? 这个链接可能对你有帮助***.com/questions/4894885/… 【参考方案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"
// ]

分解正则表达式:

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

【讨论】:

以上是关于在某个字符的最后一次出现处拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章

查找字符串中最后一次出现的数字,并按该值拆分字符串

php preg_split 最后出现的字符

在 Python 字符串中的最后一个分隔符上拆分?

在 javascript 中出现的前两个逗号处拆分字符串

shell统计某个字符串最后一次出现的位置之前的所有字符串

正则表达式 - 在最右边的斜杠出现处拆分字符串 [Hive]