J'ai les données suivantes:
1||1||Abdul-Jabbar||Karim||1996||1974
Je veux délimiter les jetons.
Ici, le délimiteur est "||"
.
Mon séparateur est:
public void setDelimiter(String delimiter) {
char[] c = delimiter.toCharArray();
this.delimiter = "\"" + "\\" + c[0] + "\\" + c[1] + "\"";
System.out.println("Delimiter string is: " + this.delimiter);
}
Cependant,
String[] tokens = line.split(delimiter);
ne donne pas le résultat requis.
Il n'est pas nécessaire de définir le délimiteur en le décomposant comme vous l'avez fait.
Voici un programme complet que vous pouvez compiler et exécuter:
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));
}
}
Si vous voulez utiliser split avec un motif, vous pouvez utiliser Pattern.compile
ou Pattern.quote
.
Pour voir compile
et quote
en action, voici un exemple utilisant les trois approches:
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));
}
}
L'utilisation de modèles est recommandée si vous souhaitez diviser souvent en utilisant le même modèle. BTW la sortie est:
[1, 1, Abdul-Jabbar, Karim, 1996, 1974]
[1, 1, Abdul-Jabbar, Karim, 1996, 1974]
[1, 1, Abdul-Jabbar, Karim, 1996, 1974]
Utilisez la méthode Pattern#quote()
pour échapper à ||
. Essayer:
final String[] tokens = myString.split(Pattern.quote("||"));
Ceci est nécessaire car |
_ est un caractère alternance et gagne donc une signification particulière lorsqu'il est passé à split
call (en gros, l'argument de split
est une expression régulière sous forme de chaîne).
Les guillemets doubles sont interprétés comme des littéraux dans regex; ce ne sont pas des caractères spéciaux. Vous essayez de faire correspondre un littéral "||"
.
Il suffit d'utiliser Pattern.quote(delimiter)
:
Comme demandé, voici une ligne de code (identique à celle de Sanjay)
final String[] tokens = line.split(Pattern.quote(delimiter));
Si cela ne fonctionne pas, vous ne transmettez pas le bon délimiteur.
String[] strArray= str.split(Pattern.quote("||"));
où
Pipe (|) est un caractère spécial dans une expression régulière. pour y échapper, vous devez le préfixer avec une barre oblique inverse (\). Mais en Java, la barre oblique inverse est aussi un caractère d'échappement. Encore une fois, vous devez y échapper avec une autre barre oblique inverse. Donc, votre regex devrait être \\|\\|
Par exemple, String[] tokens = myString.split("\\|\\|");
Split utilise regex, et le caractère de pipe |
a une signification particulière dans regex, vous devez donc y échapper. Il y a plusieurs façons de faire cela, mais voici la plus simple:
String[] tokens = line.split("\\|\\|");
String[] splitArray = subjectString.split("\\|\\|");
Vous utilisez une fonction:
public String[] stringSplit(String string){
String[] splitArray = string.split("\\|\\|");
return splitArray;
}
Quelque chose ne va pas dans votre fonction setDelimiter()
. Vous ne voulez pas doubler les délimiteurs, n'est-ce pas?
public void setDelimiter(String delimiter) {
char[] c = delimiter.toCharArray();
this.delimiter = "\\" + c[0] + "\\" + c[1];
System.out.println("Delimiter string is: " + this.delimiter);
}
Cependant, comme d'autres utilisateurs l'ont dit, il est préférable d'utiliser la méthode Pattern.quote () pour échapper à votre délimiteur si vos exigences le permettent.
StringTokenizer st = new StringTokenizer("1||1||Abdul-Jabbar||Karim||1996||1974",
"||");
while(st.hasMoreTokens()){
System.out.println(st.nextElement());
}
La réponse imprimera
1 1 Abdul-Jabbar Karim 1996 1974
Le problème vient du fait que vous ajoutez des guillemets à votre délimiteur. Il devrait être supprimé et cela fonctionnera bien.
public void setDelimiter(String delimiter) {
char[] c = delimiter.toCharArray();
this.delimiter = "\\" + c[0] + "\\" + c[1];
System.out.println("Delimiter string is: " + this.delimiter);
}