ドットを区切り文字として文字列を分割する


99

私は文字列を.正しい方法で分割しようとしているのだろうか?私のコードは:

String[] fn = filename.split(".");
return fn[0];

文字列の最初の部分だけが必要なので、最初のアイテムを返します。APIで.任意の文字を意味することに気付いたので、質問しました。

回答:


173

split()正規表現を受け入れるため、エスケープ.して、正規表現のメタ文字と見なさないようにする必要があります。次に例を示します。

String[] fn = filename.split("\\."); 
return fn[0];

17

Splitは正規表現を使用します。何かを意味する特殊文字です。実際に「。」に一致させたい場合は、エスケープする必要があります。キャラクター:

String[] fn = filename.split("\\.");

(正規表現の「。」をエスケープする1つの「\」と、Java文字列の最初のエスケープするもう1つ)

またsomething.blabla.txt、有効な名前であるという名前のファイルがある場合、実際のファイル名を返さないため、fn [0]を返すことはお勧めしません。代わりに、私はあなたが使うならより良いと思います:

int idx = filename.lastIndexOf('.');
return filename.subString(0, idx);

質問にはJavascriptではなく、Javaのタグが付けられています。これはリンク先です。
Andrei Fierbinteanu 2013年

17

ここには解決策しか表示されませんが、問題の完全な説明はありません。そのため、この回答を投稿することにしました

問題

についていくつか知っておく必要がありtext.split(delim)ます。split方法:

  1. 引数として、分割する区切り文字を表す正規表現(regex)を受け入れます。
  2. like (endlimiterが)のdelim末尾に存在する場合、最初はlikeのような配列が作成されますが、ほとんどの場合、これらの空の文字列は実際には必要ないため、自動的に削除されます。したがって、これらの末尾の空の文字列なしで別の配列を作成し、それを返しますtexta,b,c,,,split["a" "b" "c" "" ""]

また、ドット.正規表現の特殊文字であることを知っておく必要があります。任意の文字を表します(行区切り文字を除くが、これはフラグで変更できます)。Pattern.DOTALL

したがって、メソッドで"abc"分割した場合のような文字列で"." split

  1. のような配列を作成し["" "" "" ""]
  2. しかし、この配列には空の文字列しか含まれておらず、すべて後続しているため、削除されます(前の2番目のポイントで示したように)

これは、結果として空の配列[](要素なし、空の文字列すらもない)を取得することを意味します。したがってfn[0]、インデックス0がないため、使用できません。

解決

この問題を解決するには、ドットを表す正規表現を作成するだけです。そのためには、それを回避する必要があり.ます。これを行う方法はいくつかありますが、おそらく最も簡単なのは使用\することです(これはString でも特別であり、エスケープする必要がある"\\"ため、Stringで記述\する必要があります\)。

したがって、問題の解決策は次のようになります

String[] fn = filename.split("\\.");

ボーナス

他の方法を使用して、そのようなドットをエスケープすることもできます

  • 文字クラスを使用 split("[.]")
  • 引用符囲む split("\\Q.\\E")
  • Pattern.LITERALフラグ付きの適切なパターンインスタンスの使用
  • または単に使用split(Pattern.quote("."))して、正規表現にエスケープさせます。

this ..私は本当に好きです: split("[.]")
Dragonborn

15

String#split(String)メソッドは正規表現を使用します。正規表現では、「。」文字は「任意の文字」を意味します。この動作は、「。」をエスケープすることで回避できます。

filename.split("\\.");

または、splitメソッドに文字クラスで分割するように指示します。

filename.split("[.]");

文字クラスは文字のコレクションです。あなたは書くことができます

filename.split("[-.;ld7]");

ファイル名は、「-」、「。」、「;」、「l」、「d」、または「7」ごとに分割されます。文字クラスの内部では、「。」は特殊文字(「メタ文字」)ではありません。


@MisterSmithあなたはここでプログラミング言語を見てみたいかもしれません。私たちはjavascriptではなく、javaについて話している。
f1sh 2013年

あなたは、絶対に正しい。私は昨日、両方の言語でコーディングしていて、Javaデータ型に気付かなかったので疲れていました。おそらく2010年の答えは正しかったと思いますが、どういうわけか今日のブラウザの動作は異なります。
ミスタースミス

7

DOT(。)は特殊文字と見なされ、Stringのsplitメソッドは、次のように行う必要がある正規表現を想定しているため-

String[] fn = filename.split("\\.");
return fn[0];

Javaでは特殊文字は「\」でエスケープする必要がありますが、「\」もJavaの特殊文字なので、別の「\」でもう一度エスケープする必要があります。



2

使用する方が効率的ではないでしょうか

 filename.substring(0, filename.indexOf("."))

あなたが最初のドットまで何が欲しいのですか?




0

注:ドットがエスケープされた後でも、このスニペットにはさらに注意が必要です!

filenameが文字列 "。"だけの場合、fnは引き続き長さが0になり、fn [0]は例外をスローします。

これは、パターンが少なくとも1回一致する場合、splitは配列からすべての後続の空の文字列(したがってドットの前の文字列も!)を破棄し、空の配列が返されるためです。


手元にあるような場合の最も簡単な解決策は、splitの呼び出しに制限引数2も渡すことです。String [] fn = filename.split( "[。]"、2);
avl42 2018


0

ApacheCommonsを使用するのが最も簡単です。

File file = ...
FilenameUtils.getBaseName(file.getName());

フルパスからファイル名も抽出することに注意してください。


-2

split引数として正規表現を取ります。だから正規表現のメタキャラクターだからでは"\."なく渡す必要があります。".""."

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.