在某个字符的最后一次出现处拆分字符串
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"
// ]
分解正则表达式:
\\.
- 找句号
(?=[^.]*$)
- 确保后面的所有内容不是句号,不包括在比赛中)
【讨论】:
以上是关于在某个字符的最后一次出现处拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章