web-dev-qa-db-ja.com

string.splitメソッドの文字列区切り文字

次のデータがあります。

1||1||Abdul-Jabbar||Karim||1996||1974

トークンを区切りたい。

ここで、区切り文字は"||"です。

私の区切り文字セッターは次のとおりです。

public void setDelimiter(String delimiter) {
    char[] c = delimiter.toCharArray();
    this.delimiter = "\"" + "\\" + c[0] + "\\" + c[1] + "\"";
    System.out.println("Delimiter string is: " + this.delimiter);
}

しかしながら、

String[] tokens = line.split(delimiter);

必要な結果が得られません。

41
Vicky

区切り文字を設定する必要はありません。

コンパイルして実行できる完全なプログラムを次に示します。

import Java.util.Arrays;
public class SplitExample {
    public static final String PLAYER = "1||1||Abdul-Jabbar||Karim||1996||1974";
    public static void main(String[] args) {
        String[] data = PLAYER.split("\\|\\|");
        System.out.println(Arrays.toString(data));
    }
}

パターンで分割を使用する場合は、Pattern.compileまたはPattern.quoteを使用できます。

compileおよびquoteの動作を確認するために、3つのアプローチすべてを使用した例を次に示します。

import Java.util.Arrays;
import Java.util.regex.Pattern;
public class SplitExample {
    public static final String PLAYER = "1||1||Abdul-Jabbar||Karim||1996||1974";
    public static void main(String[] args) {
        String[] data = PLAYER.split("\\|\\|");
        System.out.println(Arrays.toString(data));

        Pattern pattern = Pattern.compile("\\|\\|");
        data = pattern.split(PLAYER);
        System.out.println(Arrays.toString(data));

        pattern = Pattern.compile(Pattern.quote("||"));
        data = pattern.split(PLAYER);
        System.out.println(Arrays.toString(data));
    }
}

同じパターンを使用して頻繁に分割する場合は、パターンの使用をお勧めします。ところで出力は次のとおりです。

[1, 1, Abdul-Jabbar, Karim, 1996, 1974]
[1, 1, Abdul-Jabbar, Karim, 1996, 1974]
[1, 1, Abdul-Jabbar, Karim, 1996, 1974]
54
Ray Toal

||をエスケープするには、 Pattern#quote() メソッドを使用します。試してください:

final String[] tokens = myString.split(Pattern.quote("||"));

|代替 文字であり、したがってsplit呼び出しに渡されると特別な意味を持つため、これが必要です(基本的にsplitへの引数は、文字列形式)。

33

二重引用符は、正規表現ではリテラルとして解釈されます。それらは特殊文字ではありません。リテラル"||"と一致させようとしています。

Pattern.quote(delimiter)を使用するだけです:

要求されたように、ここにコードの行があります(Sanjayのと同じ)

final String[] tokens = line.split(Pattern.quote(delimiter));

それが機能しない場合、正しい区切り文字を渡していないことになります。

8
Mark Peters
String[] strArray= str.split(Pattern.quote("||"));

どこ

  1. str = "1 || 1 || Abdul-Jabbar || Karim || 1996 || 1974";
  2. Pattern.quote( "||")は特殊文字を無視します。
  3. .split関数は、||が出現するたびに文字列を分割します。
  4. strArrayには、||で区切られた文字列の配列が含まれます。
6
Yesh

パイプ(|)は正規表現の特殊文字です。エスケープするには、円記号(\)をプレフィックスとして付ける必要があります。しかし、Javaでは、バックスラッシュもエスケープ文字です。そのため、別のバックスラッシュでエスケープする必要があります。したがって、正規表現は\\|\\|である必要があります(例:String[] tokens = myString.split("\\|\\|");

5
Nirmit Shah

Splitは正規表現を使用し、パイプ文字|は正規表現で特別な意味を持つため、エスケープする必要があります。これを行う方法はいくつかありますが、最も簡単な方法は次のとおりです。

String[] tokens = line.split("\\|\\|");
2
Bohemian
String[] splitArray = subjectString.split("\\|\\|");

関数を使用します:

public String[] stringSplit(String string){

    String[] splitArray = string.split("\\|\\|");
    return splitArray;
}
0
Pedro Lobito

setDelimiter()関数に何か問題があります。区切り文字を二重引用符で囲む必要はありませんか?

public void setDelimiter(String delimiter) {
    char[] c = delimiter.toCharArray();
    this.delimiter = "\\" + c[0] + "\\" + c[1];
    System.out.println("Delimiter string is: " + this.delimiter);
}

ただし、他のユーザーが言っているように、必要に応じて、Pattern.quote()メソッドを使用して区切り文字をエスケープすることをお勧めします。

0
shinkou
StringTokenizer st = new StringTokenizer("1||1||Abdul-Jabbar||Karim||1996||1974",
             "||");
while(st.hasMoreTokens()){
     System.out.println(st.nextElement());
}

回答が印刷されます

1 1 Abdul-Jabbar Karim 1996 1974

0
Manoj Kumar

問題は、区切り文字に引用符を追加しているためです。削除する必要があり、正常に機能します。

public void setDelimiter(String delimiter) {
    char[] c = delimiter.toCharArray();
    this.delimiter = "\\" + c[0] + "\\" + c[1];
    System.out.println("Delimiter string is: " + this.delimiter);
}
0
Raze