3 votes

Java String - split on space, but preserve double space

Actuellement, je sépare une chaîne de caractères en utilisant des espaces. Cependant, il y a certains doubles espaces que je veux préserver lorsque je les remets tous ensemble. Des suggestions sur la façon de faire cela ?

Par exemple, la chaîne de caractères "Je suis allé à la plage. J'ai mangé de la tarte" est séparée comme suit :

Je
suis
allé
à
la
plage.

J'ai
mangé
de
la
tarte

Je ne veux pas des entrées vides, mais je veux les remettre ensemble dans le même format. Merci à tous !

3voto

BlackVegetable Points 2887

Faites un String replaceAll(" ", " unlikelyCharacterSequence") puis divisez votre chaîne par des espaces comme d'habitude. Ensuite, vous pouvez convertir de nouveau en un double espace en remplaçant votre {unlikelyCharacterSequence} par " " à la fin.

Cependant : cela échouera si vous rencontrez jamais votre séquence de caractères "unlikely" dans votre String réel, non modifié. Pour une solution plus générale, vérifiez l'alternative répertoriée ci-dessous cet exemple.

Exemple (attention, dépend de la non-existence de !@#!@# :

String example = "Hello.  That was a double space. That was a single space."
String formatted = example.replace("  ", " !@#!@#");
String [] split = formatted.split(" ");
for(int i = 0; i < split.length; i++)
{
  split.replace("!@#!@#", " ");
}
// Recombine your splits?

Alternativement, vous pourriez adopter une stratégie plus robuste de recombiner la chaîne telle que vous l'avez dans votre question, mais en ignorant les éléments contenant uniquement un espace :

String example = "ThisShouldBeTwoElements.  ButItIsNot.";
String [] splitString = example.split(" ");
String recombined = "";
for(int i = 0; i < splitString.length; i++)
{
  if(!splitString[i].equals(" "))
    recombined += splitString[i];
}

2voto

FGreg Points 1436
Chaîne st = "Je suis allé à la plage.  J'ai mangé de la tarte";
st.split("\\s{1}(?!\\s)");

Cela donne comme résultat

[Je, suis, allé, à, la, plage. , J'ai, mangé, de, la, tarte]

Je suggère également de consulter http://docs.oracle.com/javase/6/docs/api/ et/ou http://www.regular-expressions.info/java.html pour comprendre ce que cela fait.

1voto

Erwald Points 1920

Jetez un coup d'œil à ce que Regex de Java peut faire pour vous. Il existe un moyen de reconnaître les modèles en utilisant regex.

Exemples de regex Java

1voto

GETah Points 10887

Essayez ceci, cela devrait supprimer tous les espaces blancs qui se trouvent entre des caractères différents de l'espace blanc.

myString = myString.replaceAll("\S\s\S", "");

Cela préservera les espaces blancs lorsqu'ils apparaissent plus d'une fois entre deux mots.

1voto

lisa Points 1092

Je sais que c'est une vieille question, mais pour le bénéfice des futurs auditeurs : le concept que vous recherchez est "groupes de capture". Les groupes de capture vous permettent de vous référer aux correspondances dans votre expression et de les récupérer ultérieurement, par exemple via une rétro-référence, au lieu que les chaînes soient absorbées.

À partir de la documentation, voici la syntaxe pertinente que vous devez connaître :

(?X)          X, en tant que groupe de capture nommé
(?:X)               X, en tant que groupe non capturant
(?idmsuxU-idmsuxU)  Rien, mais active - désactive les indicateurs de correspondance i d m s u x U
(?idmsux-idmsux:X)  X, en tant que groupe non capturant avec les indicateurs donnés i d m s u x activés - désactivés
(?=X)               X, via un regard en avant positif de largeur nulle
(?!X)               X, via un regard en avant négatif de largeur nulle
(?<=X)              X, via un regard en arrière positif de largeur nulle
(?X)               X, en tant que groupe indépendant et non capturant

En utilisant le texte d'entrée :

String example = "ABC     DEF     GHI J K";

Vous pouvez utiliser une combinaison de regard en avant positif et négatif pour combiner les espaces de fin avec chaque mot :

// Résultat : [ABC     , DEF     , GHI , J , K]
example.split("(?<=\\s+)(?!\\s)");

Ou vous pouvez capturer sur les limites des mots avec un regard en avant positif pour conserver les espaces comme éléments séparés et groupés :

// Résultat : [ABC,      , DEF,      , GHI,  , J,  , K]
example.split("(?=\\b)");

API de motif Java :
http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html


<strong><em>Note latérale :</em></strong> Bien que la suggestion de "remplacer le texte par quelque chose de complètement improbable" soit tentante car c'est facile, ne le faites <strong><em>jamais</em></strong> dans du code de production. Cela échouera éventuellement, et cela arrive plus souvent que vous ne le pensez. J'ai débogué un centre d'appels après qu'un programmeur ait utilisé environ 80 colonnes de "~=$~=$~=$..." en pensant que c'était sûr. Cela a duré quelques mois jusqu'à ce qu'un représentant du service enregistre une "bordure fantaisie" sur ses notes avec juste cette séquence. J'ai même été témoin d'une collision MD5 authentique et aléatoire sur un serveur de recherche. Bien entendu, la collision MD5 a pris 11 ans, mais elle a quand même fait planter la recherche et le point reste le même. <strong>Les chaînes uniques ne le sont jamais. Supposez toujours que des doublons apparaîtront.</strong>

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