如何将文件名拆分为基础和扩展名

时间:2016-05-12 16:35:47

标签: java regex

所以我正在尝试将文件名拆分为基础及其扩展名。我找到this这个问题的答案,但我有另一个条件,这个答案没有回答。我有两个条件需要补充:

1。如果文件以“。”开头。并且没有任何其他时间段,那么它就像第一个句点是文件名的一部分,并且没有扩展名(扩展名为“”)。 上面链接中的答案

fileName.split("\\.(?=[^\\.]+$)")

将返回给定的文件名“.Myfile”

["",MyFile"]

但我希望它返回的是

[.MyFile,""]

有没有办法使用正则表达式(改变条件)?

2。无论文件名是什么,我都需要2个单元格。如果文件名是“ README ”,那么我仍然希望创建两个单元格,第二个单元格应该包含一个空字符。

我想:

  

[README,""]

将被退回。

这可能吗?

编辑:已解决! 感谢WiktorStribiżew的帮助,我解决了它。我把它改成了

String fileName;
String[] splitedName
String pat = "((?!^)\\.(?=[^.]*$|(?<=^\\.[^.]{0,1000})$))|$";
fileName = "README.txt"
System.out.println(Arrays.toString(fileName .split(pat,2)));
fileName = ".README"
System.out.println(Arrays.toString(fileName .split(pat,2)));
fileName = "README"

结果

"README.txt" => [REAADME,txt]
".README" => [REAADME, ]
"README" => [REAADME, ]

我想要的。

2 个答案:

答案 0 :(得分:2)

最终解决方案:

String pat = "(?!^)\\.(?=[^.]*$)|(?<=^\\.[^.]{0,1000})$|$";

该模式包含3个可拆分的替代方案:

  • (?!^)\\.(?=[^.]*$) - 用一个不是字符串中第一个字符的点((?!^))拆分,并且在其右边的.以外有0+个字符,直到string end(``)
  • (?<=^\\.[^.]{0,1000})$) - 如果字符串以文字.开头并且有0到1000个字符(可能设置为1,256就足够了,但文件更长,则会在字符串末尾拆分名称,请相应调整)
  • $ - 在字符串末尾拆分(如果字符串以\\z结尾,则不需要\n替换为\n

当您将2作为限制参数传递给split方法时,您可以将拆分数限制为仅两个,请参阅Java demo

System.out.println(Arrays.toString(".MyFile".split(pat,2)));            // [.MyFile, ]
System.out.println(Arrays.toString("MyFile.ext".split(pat,2)));         // [MyFile, ext]
System.out.println(Arrays.toString("Another.MyFile.ext".split(pat,2))); // [Another.MyFile, ext]
System.out.println(Arrays.toString("MyFile.".split(pat,2)));            // [MyFile, ]
System.out.println(Arrays.toString("MyFile".split(pat,2)));             // [MyFile, ]

原始答案

我相信你在寻找

(?!^)\\.(?=[^.]*$)|(?<=^\\.[^.]{0,1000})$

注意:可以与split一起使用的模式使用约束宽度的lookbehind,假定文件的长度不能超过1000.根据需要增加值。

请参阅IDEONE demo

String pat = "(?!^)\\.(?=[^.]*$)|(?<=^\\.[^.]{0,1000})$";
String s = ".MyFile";
System.out.println(Arrays.toString(s.split(pat,-1)));
s = "MyFile.ext";
System.out.println(Arrays.toString(s.split(pat,-1)));
s = "Another.MyFile.ext";
System.out.println(Arrays.toString(s.split(pat,-1)));
s = "MyFile.";
System.out.println(Arrays.toString(s.split(pat,-1)));

结果:

".MyFile"            => [.MyFile, ]
"MyFile.ext"         => [MyFile, ext]
"Another.MyFile.ext" => [Another.MyFile, ext]
"MyFile."            => [MyFile, ]

答案 1 :(得分:0)

您可以使用拆分将文件名转换为数组,然后遍历数组并查找&#34;之后的所有内容。&#34;

以下是一些示例代码。

    String str = "cat.txt";
    char[] cArray = str.toCharArray();

然后遍历数组并找到&#34;。&#34;并捕捉它之后的一切。