回答:
split()正規表現を受け入れるため、エスケープ.して、正規表現のメタ文字と見なさないようにする必要があります。次に例を示します。
String[] fn = filename.split("\\.");
return fn[0];
Splitは正規表現を使用します。何かを意味する特殊文字です。実際に「。」に一致させたい場合は、エスケープする必要があります。キャラクター:
String[] fn = filename.split("\\.");
(正規表現の「。」をエスケープする1つの「\」と、Java文字列の最初のエスケープするもう1つ)
またsomething.blabla.txt、有効な名前であるという名前のファイルがある場合、実際のファイル名を返さないため、fn [0]を返すことはお勧めしません。代わりに、私はあなたが使うならより良いと思います:
int idx = filename.lastIndexOf('.');
return filename.subString(0, idx);
ここには解決策しか表示されませんが、問題の完全な説明はありません。そのため、この回答を投稿することにしました
についていくつか知っておく必要がありtext.split(delim)ます。split方法:
delim末尾に存在する場合、最初はlikeのような配列が作成されますが、ほとんどの場合、これらの空の文字列は実際には必要ないため、自動的に削除されます。したがって、これらの末尾の空の文字列なしで別の配列を作成し、それを返します。texta,b,c,,,split["a" "b" "c" "" ""]また、ドット.は正規表現の特殊文字であることを知っておく必要があります。任意の文字を表します(行区切り文字を除くが、これはフラグで変更できます)。Pattern.DOTALL
したがって、メソッドで"abc"分割した場合のような文字列で"." splitは
["" "" "" ""]、これは、結果として空の配列[](要素なし、空の文字列すらもない)を取得することを意味します。したがってfn[0]、インデックス0がないため、使用できません。
この問題を解決するには、ドットを表す正規表現を作成するだけです。そのためには、それを回避する必要があり.ます。これを行う方法はいくつかありますが、おそらく最も簡単なのは使用\することです(これはString でも特別であり、エスケープする必要がある"\\"ため、Stringで記述\する必要があります\)。
したがって、問題の解決策は次のようになります
String[] fn = filename.split("\\.");
ボーナス
他の方法を使用して、そのようなドットをエスケープすることもできます
split("[.]")split("\\Q.\\E")Pattern.LITERALフラグ付きの適切なパターンインスタンスの使用split(Pattern.quote("."))して、正規表現にエスケープさせます。split("[.]")
String#split(String)メソッドは正規表現を使用します。正規表現では、「。」文字は「任意の文字」を意味します。この動作は、「。」をエスケープすることで回避できます。
filename.split("\\.");
または、splitメソッドに文字クラスで分割するように指示します。
filename.split("[.]");
文字クラスは文字のコレクションです。あなたは書くことができます
filename.split("[-.;ld7]");
ファイル名は、「-」、「。」、「;」、「l」、「d」、または「7」ごとに分割されます。文字クラスの内部では、「。」は特殊文字(「メタ文字」)ではありません。
通常、手動でマスクを解除することはお勧めしません。このタスクには、Patternクラスにメソッドがあります。
java.util.regex
static String quote(String s)
分割は引数として正規表現を使用している必要があります...に変更"."してください"\\."
注:ドットがエスケープされた後でも、このスニペットにはさらに注意が必要です!
filenameが文字列 "。"だけの場合、fnは引き続き長さが0になり、fn [0]は例外をスローします。
これは、パターンが少なくとも1回一致する場合、splitは配列からすべての後続の空の文字列(したがってドットの前の文字列も!)を破棄し、空の配列が返されるためです。