回答:
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のような配列が作成されますが、ほとんどの場合、これらの空の文字列は実際には必要ないため、自動的に削除されます。したがって、これらの末尾の空の文字列なしで別の配列を作成し、それを返します。text
a,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は配列からすべての後続の空の文字列(したがってドットの前の文字列も!)を破棄し、空の配列が返されるためです。