次のデータがあります。
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);
必要な結果が得られません。
区切り文字を設定する必要はありません。
コンパイルして実行できる完全なプログラムを次に示します。
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]
||
をエスケープするには、 Pattern#quote()
メソッドを使用します。試してください:
final String[] tokens = myString.split(Pattern.quote("||"));
|
は 代替 文字であり、したがってsplit
呼び出しに渡されると特別な意味を持つため、これが必要です(基本的にsplit
への引数は、文字列形式)。
二重引用符は、正規表現ではリテラルとして解釈されます。それらは特殊文字ではありません。リテラル"||"
と一致させようとしています。
Pattern.quote(delimiter)
を使用するだけです:
要求されたように、ここにコードの行があります(Sanjayのと同じ)
final String[] tokens = line.split(Pattern.quote(delimiter));
それが機能しない場合、正しい区切り文字を渡していないことになります。
String[] strArray= str.split(Pattern.quote("||"));
どこ
パイプ(|)は正規表現の特殊文字です。エスケープするには、円記号(\)をプレフィックスとして付ける必要があります。しかし、Javaでは、バックスラッシュもエスケープ文字です。そのため、別のバックスラッシュでエスケープする必要があります。したがって、正規表現は\\|\\|
である必要があります(例:String[] tokens = myString.split("\\|\\|");
Splitは正規表現を使用し、パイプ文字|
は正規表現で特別な意味を持つため、エスケープする必要があります。これを行う方法はいくつかありますが、最も簡単な方法は次のとおりです。
String[] tokens = line.split("\\|\\|");
String[] splitArray = subjectString.split("\\|\\|");
関数を使用します:
public String[] stringSplit(String string){
String[] splitArray = string.split("\\|\\|");
return splitArray;
}
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()メソッドを使用して区切り文字をエスケープすることをお勧めします。
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
問題は、区切り文字に引用符を追加しているためです。削除する必要があり、正常に機能します。
public void setDelimiter(String delimiter) {
char[] c = delimiter.toCharArray();
this.delimiter = "\\" + c[0] + "\\" + c[1];
System.out.println("Delimiter string is: " + this.delimiter);
}