web-dev-qa-db-ja.com

区切り文字としてドットを使用して文字列を分割

.で文字列を正しい方法で分割しようとしているかどうか疑問に思っていますか?私のコードは:

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

文字列の最初の部分だけが必要なため、最初の項目を返します。 APIで.が任意の文字を意味することに気づいたので、私は尋ねます。

90
Dean

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

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

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

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

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

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

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

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

filename.split("\\.");

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

filename.split("[.]");

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

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

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

14
f1sh

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

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

Javaでは、特殊文字は「\」でエスケープする必要がありますが、「\」はJavaでも特殊文字であるため、別の「\」で再度エスケープする必要があります!

6
Neel
String str="1.2.3";
String[] cats = str.split(Pattern.quote("."));
3
Magnus Persson

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

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

最初のドットまでしか必要ない場合は?

2
Martin Smith

通常、手動でマスクを解除することはお勧めできません。このタスクには、Patternクラスにメソッドがあります。

Java.util.regex
static String quote(String s) 
2

分割では、正規表現を引数として使用する必要があります...単に"."から"\\."

1
Bob Fincheimer

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

Filenameが単なる文字列 "。"の場合、fnの長さは0のままになり、fn [0]は例外をスローします!

これは、パターンが少なくとも1回一致すると、splitは末尾の空文字列をすべて破棄(したがって、beforeドット!)配列から、返される空の配列を残します。

0
avl42