2016-05-12 65 views
1

所以我試圖將文件名拆分爲基礎和擴展。我發現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, ] 

因爲我想。

+0

在這一點上,它感覺像一個簡短的方法來解析文件名是更好的選擇。 – markspace

+0

上述問題中所述的要求與重複問題不完全匹配 – Sanjeev

+0

這絕對不是重複問題。我甚至補充了原始問題,並指出了爲了獲得正確的表格而需要做出的兩個重大差異。 –

回答

2

最終溶液:

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

該圖案由3個替代品與分裂:

  • (?!^)\\.(?=[^.]*$) - 以一個點不是字符串((?!^))中的第一個字符分割和除了.以外的0以外的字符,直到字符串結尾(「`)
  • (?<=^\\.[^.]{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使用的方式使用約束的寬度回顧後,它假定該文件的長度不能超過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, ] 
+0

首先,謝謝!你解決了我的第一個問題。但是,你能幫我解決第二個問題嗎?我希望「_README_」結果爲 '[README,]' - 如果原始文件名沒有點,我仍然希望將其視爲空擴展名(「」) ,如果解釋了正則表達式你寫了?謝謝! –

+1

所以我想我解決了它,這要歸功於* WiktorStribiżew*/ 我在最後添加了| $,並且在分割操作中我將其限制爲2,這意味着: 'String pat =「((?!^)\ \。(?= [^。] * $ |(?<=^\\。[^。] {0,1000})$))| $「 'myText2.split(pat,2)' and now我得到了想要的結果 –

0

你可以使用一個分割通過陣列打開文件名到一個數組,然後循環,發現一切是後「。」

以下是一些示例代碼。

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

然後遍歷數組並找到「。」。並捕捉它後面的所有內容。

相關問題