Comment séparer Ssortingng avec un séparateur mais sans supprimer ce séparateur en Java?

Je suis confronté à un problème de division de Ssortingng .

Je veux diviser une Ssortingng avec un séparateur mais sans perdre ce séparateur.

Lorsque nous utilisons la somessortingng.split(Ssortingng separator) en Java, elle divise la Ssortingng mais supprime la partie séparateur de la Ssortingng . Je ne veux pas que cela se produise.

Je veux des résultats comme ci-dessous:

 Ssortingng ssortingng1="Ram-sita-laxman"; Ssortingng seperator="-"; ssortingng1.split(seperator); 

Sortie:

 [Ram, sita, laxman] 

mais je veux le résultat comme celui ci-dessous à la place:

 [Ram, -sita, -laxman] 

Y a-t-il un moyen d’obtenir un tel résultat?

 ssortingng1.split("(?=-)"); 

Cela fonctionne parce que split prend une expression régulière . Ce que vous voyez en réalité, c’est un «lookahead positif sans largeur».

J’aimerais expliquer plus mais ma fille veut jouer au thé. 🙂

Edit: Retour!

Pour expliquer cela, je vais d’abord vous montrer une opération de split différente:

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

Cela divise votre chaîne sur chaque chaîne de longueur zéro. Il y a une chaîne de longueur nulle entre chaque caractère. Par conséquent, le résultat est le suivant:

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

Maintenant, je modifie mon expression régulière ( "" ) pour correspondre uniquement aux chaînes de longueur nulle si elles sont suivies d’un tiret .

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

Dans cet exemple, le ?= Signifie “lookahead”. Plus précisément, cela signifie “lookahead positif “. Pourquoi le “positif”? Parce que vous pouvez aussi avoir un lookahead négatif ( ?! ) Qui se divisera sur chaque chaîne de longueur zéro suivie d’un tiret:

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

Vous pouvez également avoir un lookbehind positif ( ?<= ) Qui sera divisé sur chaque chaîne de longueur zéro précédée d'un tiret:

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

Enfin, vous pouvez également avoir un lookbehind négatif ( ? ) Qui sera divisé sur chaque chaîne de longueur zéro qui n'est pas précédée d'un tiret:

 "Ram-sita-laxman".split("(? 

Ces quatre expressions sont appelées collectivement les expressions de présentation .

Bonus: les rassembler

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

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

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

 "MyAwesomeClass".split("(?<=[az])(?=[AZ])"); 

Cela divise chaque chaîne de longueur zéro précédée d'une lettre minuscule ( (?<=[az]) ) et suivie d'une lettre majuscule ( (?=[AZ]) ).

Cette technique fonctionne également avec les identifiants camelCase.

C’est un peu risqué, mais vous pouvez introduire un séparateur factice en utilisant une fonction de remplacement. Je ne connais pas les méthodes Java, mais en C # cela pourrait être quelque chose comme:

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

Bien sûr, vous devrez choisir un séparateur factice qui ne sera garanti nulle part ailleurs dans la chaîne.

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

 seperator="-"; Ssortingng[] splitssortingngs = ssortingng1.split(seperator); for(int i=1; i 

c'est le code qui correspond à la réponse de LadaRaider.

Adam a frappé la tête! J’ai utilisé sa réponse pour comprendre comment insérer le texte du nom de fichier du navigateur de dialog de fichier dans une zone de texte riche. Le problème que j’ai rencontré était lorsque j’ajoutais une nouvelle ligne à la ligne “\” dans la chaîne de fichiers. La commande ssortingng.split était en train de se séparer de \ et de la supprimer. Après avoir utilisé un mélange du code d’Adam, j’ai pu créer une nouvelle ligne après chaque \ dans le nom du fichier.

Voici le code que j’ai utilisé:

 OpenFileDialog fd = new OpenFileDialog(); fd.Multiselect = true; fd.ShowDialog(); foreach (ssortingng filename in fd.FileNames) { ssortingng currentfiles = uxFiles.Text; ssortingng value = "\r\n" + filename; //This line allows the Regex command to split after each \ in the filename. ssortingng[] lines = Regex.Split(value, @"(?<=\\)"); foreach (string line in lines) { uxFiles.Text = uxFiles.Text + line + "\r\n"; } } 

Prendre plaisir!

Gommage