68 votes

comment diviser chaîne par un séparateur, mais sans retirer le séparateur en Java?

Je suis face à problème dans le fractionnement de la chaîne. En fait, je veux découper une chaîne avec certains séparateur, mais sans perdre un séparateur.

Lorsque nous utilisons somestring.split(String separator) méthode en java, il coupe la corde, mais supprime le séparateur partie de la chaîne.Il ne devrait pas arriver. Je veux le résultat comme ci-dessous: Exemple::mot1="Ram-sita-laxman";

     seperator="-";

     string1.split(seperator);

sortie : [Ram, sita, laxman]

mais je veux le résultat du genre :[Ram, -sita, -laxman]

est-il possible d'obtenir une sortie de ce genre?

210voto

Adam Paynter Points 22056
string1.split("(?=-)");

Cela fonctionne parce qu' split prend réellement une expression régulière. Ce que vous êtes en train de voir est un "zéro-largeur d'anticipation positif".

J'aimerais expliquer plus mais ma fille veut jouer la partie de thé. :)

Edit: De Retour!

Pour expliquer cela, je vais d'abord vous montrer un autre split fonctionnement:

"Ram-sita-laxman".split("");

Ce partage votre chaîne sur chaque chaîne de longueur nulle. Il y a une chaîne de longueur zéro entre chaque personnage. Par conséquent, le résultat est:

["", "R", "a", "m", "-", "s", "i", "t", "a", "-", "l", "a", "x", "m", "a", "n"]

Maintenant, j'ai modifier mon expression régulière ("") seulement des chaînes de longueur nulle si ils sont suivis par un tiret.

"Ram-sita-laxman".split("(?=-)");
["Ram", "-sita", "-laxman"]

Dans cet exemple, l' ?= moyen "d'anticipation". Plus précisément, cela signifie "positif d'anticipation". Pourquoi le "positif"? Car vous pouvez aussi avoir des négatifs d'anticipation (?!) qui sera divisée sur chaque chaîne de longueur nulle est pas suivi d'un tiret:

"Ram-sita-laxman".split("(?!-)");
["", "R", "a", "m-", "s", "i", "t", "a-", "l", "a", "x", "m", "a", "n"]

Vous pouvez également vous positif lookbehind (?<=) qui sera divisée sur chaque chaîne de longueur nulle est précédée par un tiret:

"Ram-sita-laxman".split("(?<=-)");
["Ram-", "sita-", "laxman"]

Enfin, vous pouvez également avoir des négatifs lookbehind (?<!) qui sera divisée sur chaque chaîne de longueur nulle est pas précédé d'un tiret:

"Ram-sita-laxman".split("(?<!-)");
["", "R", "a", "m", "-s", "i", "t", "a", "-l", "a", "x", "m", "a", "n"]

Ces quatre expressions sont collectivement connus comme la lookaround expressions.

Bonus: les Mettre ensemble

Je voulais juste montrer un exemple que j'ai rencontré récemment qui combine deux de la lookaround expressions. Supposons que vous souhaitez diviser un CapitalCase identificateur de ses jetons:

"MyAwesomeClass" => ["My", "Awesome", "Class"]

Vous pouvez accomplir cela en utilisant cette expression régulière:

"MyAwesomeClass".split("(?<=[a-z])(?=[A-Z])");

Cette fentes sur chaque chaîne de longueur nulle est précédée par une lettre minuscule ((?<=[a-z])) suivie par une lettre majuscule ((?=[A-Z])).

Cette technique fonctionne aussi avec les camelCase identifiants.

4voto

Andrew Cooper Points 21126

C'est un peu douteux, mais vous pouvez introduire un mannequin séparateur à l'aide d'une fonction remplacer. Je ne connais pas les méthodes de Java, mais en C# il pourrait être quelque chose comme:

string1.Replace("-", "#-").Split("#");

Bien sûr, vous aurez besoin de choisir un mannequin séparateur qui est garanti de ne pas être n'importe où ailleurs dans la chaîne.

2voto

Dalmas Points 13600

Une façon de le faire est de diviser votre chaîne, puis ajouter votre séparateur au début de chaque extrait chaîne à l'exception de la première.

1voto

mad Points 2492
seperator="-";
String[] splitstrings = string1.split(seperator);
for(int i=1; i<splitstring.length;i++)
{
   splitstring[i] = seperator + splitstring[i];
}

qui est le code de raccord pour LadaRaider de réponse.

0voto

Walrusking Points 13

Adam a frappé le clou sur la tête! J'ai utilisé sa réponse à la figure comment insérer de texte nom de fichier de la boîte de dialogue de fichier navigateur dans une zone de texte enrichi. Le problème que j'ai rencontré quand j'étais en ajoutant une nouvelle ligne à l' "\" dans le fichier string. La chaîne de caractères.commande diviser séparation à l' \ et supprimer. Après l'aide d'un mélange d'Adam code que j'ai été en mesure de créer une nouvelle ligne après chaque \ dans le nom de fichier.

Voici le code que j'ai utilisé:

OpenFileDialog fd = new OpenFileDialog();
        fd.Multiselect = true;
        fd.ShowDialog();

        foreach (string filename in fd.FileNames)
        {
            string currentfiles = uxFiles.Text;
            string value = "\r\n" + filename;

     //This line allows the Regex command to split after each \ in the filename. 

            string[] lines = Regex.Split(value, @"(?<=\\)");

            foreach (string line in lines)
            {
                uxFiles.Text = uxFiles.Text + line + "\r\n";
            }
        }

Profitez-en!

Walrusking

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