web-dev-qa-db-fra.com

Délimiteur de chaîne dans la méthode string.split

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.

41
Vicky

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]
54
Ray Toal

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).

33
Sanjay T. Sharma

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.

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

  1. str = "1 || 1 || Abdul-Jabbar || Karim || 1996 || 1974";
  2. Pattern.quote ("||") ignorera le caractère spécial.
  3. La fonction .split divisera la chaîne pour chaque occurrence de ||.
  4. strArray aura le tableau de chaîne délimité par ||.
6
Yesh

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("\\|\\|");

5
Nirmit Shah

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("\\|\\|");
2
Bohemian
String[] splitArray = subjectString.split("\\|\\|");

Vous utilisez une fonction:

public String[] stringSplit(String string){

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

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.

0
shinkou
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

0
Manoj Kumar

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);
}
0
Raze