2016-05-12 6 views
1

ファイル名をベースに分割しようとしていますが、その拡張子です。私はこの質問にthis答えを見つけましたが、私はこの答えが答えない別の条件があります。私は追加する必要がある2つの条件があります:ファイル名をベースと拡張子に分割する方法

1.ファイルが "。"で始まる場合、他のピリオドがない場合は、最初のピリオドがファイル名の一部であり、拡張子がない(拡張子が "")ようにカウントされます。

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

はリンク 答えが与えられたファイル名 ".Myfile" のために

["",MyFile"]

を返しますが、私はそれを返すようにしたいことは

[.MyFile,""] 

されています正規表現を使用して(条件を変更して)行う方法はありますか?

2.ファイル名に関係なく、2つのセルが必要です。ファイル名が "README"の場合は、まだ2つのセルを作成する必要があり、2番目のセルに空の文字が含まれている必要があります。

私がしたい:

[README,""]

が返されます。

これは可能ですか?

編集:解決済み! の助けを借りてWiktorStribiżew私はそれを解決しました。私が望んでいたように私は結果

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

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" 

にそれを変更しました。

+0

この時点では、ファイル名を解析する短い方法の方が良い選択肢だと感じます。 – markspace

+0

上記の質問に記載されている要件は、重複した質問と完全に一致していません – Sanjeev

+0

これは明らかに重複した質問ではありません。私はオリジナルのqurstionを追加し、正しい形式を得るために必要な2つの大きな違いを述べました。 –

答えて

2

最終溶液:

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

パターンで分割する3つの代替手段で構成されています

  • (?!^)\\.(?=[^.]*$) - 文字列の最初の文字でないドット((?!^))と、その分割文字列の末尾( ``)まで.以外の0文字以上
  • (?<=^\\.[^.]{0,1000})$) - 文字列がリテラルで始まる場合は、文字列の最後に分割されますと0〜1000文字(多分1,256に設定することは十分ですが、長いファイル名が存在し、それに応じて調整してください)
  • $ている - 文字列の末尾の分割あなたは何\nを必要としない場合は、文字列の終了した場合(\\zと交換しますあなたはsplit方法には限界引数として2を渡すときは、ちょうど2つに分割数を制限することができ

\nで、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で使用できるパターンは、ファイルの長さが超えることができないことを前提として制約幅の後読みを使用しています必要に応じて値を増やします。

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

を最初に確認してください、ありがとうございました!あなたは私が持っていた最初の問題を解決しました。しかし、あなたはおそらく2番目のもので私を助けることができますか?私は "_README_"の結果を '[README、]'にします。元のファイル名にドットがない場合は、空の拡張子( "")と見なしたいと思います。あなたが書いた?ありがとう! –

+1

私はそれを解決したと思います* WiktorStribiżew*/ 最後に$を追加しましたが、分割操作では2に制限されています: 'String pat ="((?!^)\ \ "(?= [^。] * $ |(?<=^\\。[^。] {0,1000})$))| $" 'myText2.split(pat、2) ' 私は欲しい結果を得る –

0

あなたは配列にファイル名をオンにするスプリットを使用して、配列をループした後で、すべてを見つけることができます"。"

ここにいくつかのコード例を示します。

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

そして、配列をループして "。"それ以降のすべてをキャプチャします。

関連する問題