-3
votes

Comment scinder le texte par des chiffres et des groupes de mots

supposer que j'ai une chaîne contenant - une chaîne séparée par des virgules - et texte xxx

Je voudrais les extraire dans un tableau qui est divisé par "chiffres" et "groupe de mots" xxx

NOTE 0: Il pourrait y avoir plusieurs espaces entre chaque entrée, qui devrait être ignoré.

Note 1: "Cargo marin" et "Plus de texte" n'est pas séparé en différentes cordes car ils sont un groupe de mots Sans chiffres les séparant. Bien que arga et argb soient séparés car il y a un nombre entre eux.


7 commentaires

2 Marine Cargo , comment savons-nous que cargo appartient à marine ?


La valeur "14,642" est-elle en tant que valeur unique ou deux valeurs E.g: "14" et "642" dans votre sortie attendue?


Pas assez d'informations pour résoudre ce problème vraiment. Comment savons-nous que cargo marine devrait être un seul élément? Ne devrait-il pas être rejoint avec le 2 résultant dans 2 cargo marine ? Ensuite, nous pourrions supposer que chaque élément a une longueur de 20-25 caractères avec un peu de remplissage ajouté.


@Stephanhogenboom Ya 14,642 est la valeur unique


Voulez-vous diviser votre ligne par "chiffres" et "groupe de mots"?


@Angelkoh par groupe de mots


J'ai reformulé votre question et votre titre. Votre titre précédent était trop générique et questionne trop ambiguë (entraînant une vague de bowvotes.) J'espère que cela aide.


4 Réponses :


1
votes

Si les espaces sont votre problème. String # Split prend une regex comme paramètre. Ensuite, vous pourriez faire cela: My_List = Arrays.Aslist (my_string.split ("\ s?"));

Mais cela ne résoudra pas tous les problèmes, comme ceux mentionnés dans les commentaires.


0 commentaires

1
votes

Vous pouvez faire quelque chose comme si:

    List<String> strings = new ArrayList<>();
    String prev = null;
    for (String w: my_string.split("\\s+")) {
        if (w.matches("\\d+(?:,\\d+)?")) {
            if (prev != null) {
                strings.add(prev);
                prev = null;
            }
            strings.add(w);
        } else if (prev == null) {
            prev = w;
        } else {
            prev += " " + w;
        }
    }
    if (prev != null) {
        strings.add(prev);
    }


0 commentaires

3
votes

Vous pouvez essayer de fractionnement en utilisant cette regex xxx

  • [0-9,] + // recherchera un ou plusieurs chiffres et virgules
  • [a-za-z] + [a-za-z] // recherchera un mot, suivi d'un espace (le cas échéant) suivi d'un autre mot (si quelconque). XXX

    Vous les utilisez comme ceci xxx

    Ce qui suit est la sortie ainsi qu'une explication détaillée de la regex qui est autogogenée de https://regex101.com

     Entrez la description de l'image ici < Pré> xxx


0 commentaires

1
votes

J'aime Solution Angel Koh et vouloir ajouter dessus. Sa solution ne correspondra que si la partie numérique consiste en une ou deux parties.

Si vous souhaitez également capturer des pièces composées de trois parties ou plus, vous devez modifier le regex un peu à: ([\ d,] + | [a-za-z] + (?: * [a-za-z]) *)
Le groupe non capturant (?: * [a-za-z]) répète les temps infinis, si nécessaire et capturera toutes les pièces numériques pures.


0 commentaires