4 votes

Java - couper une chaîne de caractères d'une manière spécifique

J'ai une chaîne de caractères (tirée du fichier) :

Ordinateur : intel, carte graphique : Nvidia,

Souris : razer, couleur : blanc etc.

J'ai besoin de prendre les mots entre " :" et ",".

Quand je fais ça de cette façon

Scanner sc = new Scanner(new File(path));
    String str = sc.nextLine();

    ArrayList<String> list = new ArrayList<String>();

    while (sc.hasNextLine()) {

        for (int i = 0; i < str.length(); i++) {
            list.add(str.substring(str.indexOf(":"), str.indexOf(",")));
        }
        System.out.println("test");

        sc.nextLine();

    }

Je ne prends que " : intel". Je ne sais pas comment prendre plus de mots de la même ligne et les mots de la ligne suivante.

1voto

Alok Points 31

Vous êtes confronté à ce problème parce que la fonction indexof() renvoie la première occurrence de ce caractère dans la chaîne. Vous obtenez donc la sous-chaîne entre la première occurrence de ':' et la première occurrence de ',' . Pour résoudre votre problème, utilisez les fonctions FirstIndexOf() et LastIndexOf() avec str.substring au lieu de la fonction IndexOf(). Vous obtiendrez ainsi la sous-chaîne comprise entre la première occurrence de ':' et la dernière occurrence de ',' . J'espère que cette réponse vous sera utile.

1voto

Arvind Kumar Avinash Points 49501

En supposant le contenu du fichier, test.txt est le suivant :

Computer: intel, graphic card: Nvidia
Mouse: razer, color: white

Le programme suivant

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

class Coddersclub {
    public static void main(String[] args) throws FileNotFoundException {
        Scanner sc = new Scanner(new File("test.txt"));
        ArrayList<String> list = new ArrayList<String>();
        String str = "";
        while (sc.hasNextLine()) {
            str = sc.nextLine();
            String[] specs = str.split(",");
            for (String item : specs) {
                list.add(item.substring(item.indexOf(":") + 1).trim());
            }
        }
        System.out.println(list);
    }
}

sortie :

[intel, Nvidia, razer, white]

Nota: si vous cherchez à ce que la liste soit aussi [: intel, : Nvidia, : razer, : white] , remplacer list.add(item.substring(item.indexOf(":") + 1).trim()); con list.add(item.substring(item.indexOf(":")).trim()); .

N'hésitez pas à commenter si vous cherchez autre chose.

1voto

Common Man Points 1081

Une solution toujours d'actualité est :

String string = "Computer: intel, graphic card: Nvidia,";

Map<String,String> map = Pattern.compile("\\s*,\\s*")
    .splitAsStream(string.trim())
    .map(s -> s.split(":", 2))
    .collect(Collectors.toMap(a -> a[0], a -> a.length>1? a[1]: ""));
System.out.println(map.values());

Sortie :

[ Nvidia,  intel]

0voto

Sir Beethoven Points 303

Vous pouvez utiliser une expression rationnelle pour cela. Pour extraire le texte entre un : et le dernier , dans la ligne, utilisez quelque chose comme :

(?<=\:)(.*?)(?=\,\n)

Vous pouvez alors effectuer une opération comme celle-ci :

String mytext = "Computer: intel, graphic card: Nvidia,\n" + 
                  "Mouse: razer, color: white etc.";
Pattern pattern = Pattern.compile("(?<=\:)(.*?)(?=\,\n)");
Matcher matcher = pattern.matcher(mytext);
if (matcher.find())
{
    System.out.println(matcher.group(1));
}

La sortie sera :

 intel, graphic card: Nvidia

Inspiré par este y cet autre des fils.

0voto

Chiran K. Points 164

Modifiez votre code comme suit pour résoudre le problème.

Scanner sc = new Scanner(new File(path));

    ArrayList<String> list = new ArrayList<String>();

    while (sc.hasNextLine()) {
        String str = sc.nextLine();

         String[] sp = testString.split(",");

        for(int i=0;i<sp.length;i++){
            list.add(sp[i].split(":")[1]);
        }
    }

// vous obtiendrez la liste comme intel ,nvdia, razor etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X