J'ai un problème pour diviser la chaîne en nouvelle ligne dans vb.net. maintenant, je peux le séparer par un seul espace.Je veux diviser la nouvelle ligne après 3 espaces.
Dim s As String = "SOMETHING BIGGER THAN YOUR DREAM" Dim words As String() = s.Split(New Char() {" "c}) For Each word As String In words Console.WriteLine(word) Next output : SOMETHING BIGGER THAN YOUR DREAM Desire output : SOMETHING BIGGER THAN YOUR DREAM
4 Réponses :
Au lieu d'utiliser la division, vous pouvez capturer 3 mots dans un groupe de capture et faire correspondre les caractères d'espacement de fin.
Dans le remplacement, utilisez le groupe suivi d'une nouvelle ligne.
Motif
SOMETHING BIGGER THAN YOUR DREAM
Cela correspondra à:
(
Groupe de capture 1
\ S +
Correspond à 1+ caractères non blancs (?: \ s + \ S +) {2}
Répétez 2 fois avec 1+ caractères blancs et 1+ caractères non blancs )
Fermer le groupe 1 \ s *
Faire correspondre les caractères d'espacement de fin . NET Regex demo | Démo VB.NET
Exemple de code
Dim s As String = "SOMETHING BIGGER THAN YOUR DREAM" Dim output As String = Regex.Replace(s, "(\S+(?:\s+\S+){2})\s*", "$1" + Environment.NewLine) Console.WriteLine(output)
Une excellente réponse pour les futurs lecteurs, mais pensez-vous vraiment que cette affiche est prête pour Regex?
@Mary On ne sait jamais :) C'est une option comment on pourrait le résoudre.
Merci pour l'explication supplémentaire.
String.Join a une surcharge qui vous aidera.
Le premier paramètre est le caractère à utiliser entre les éléments de votre tableau.
Le deuxième paramètre est le tableau que vous souhaitez joindre. p >
Le troisième paramètre est la position de départ, pour la première ligne de votre sortie souhaitée, ce serait l'élément à l'index 0.
Le quatrième paramètre est la longueur à utiliser, pour la première ligne, nous voulons trois éléments de tableau.
Private Sub OPCode() Dim s As String = "SOMETHING BIGGER THAN YOUR DREAM" Dim words As String() = s.Split(New Char() {" "c}) Dim line1 As String = String.Join(" ", words, 0, 3) Console.WriteLine(line1) Dim line2 As String = String.Join(" ", words, 3, words.Length - 3) Console.WriteLine(line2) End Sub
Une autre alternative ajoutée aux réponses efficaces existantes pourrait être:
Dim separator As Char = CChar(" ") Dim sArr As String() = "SOMETHING BIGGER THAN YOUR DREAM".Split(separator) Dim indexOfSplit As Integer = 3 Dim sFinal As String = Join(sArr.Take(indexOfSplit).ToArray, separator) & vbNewLine & Join(sArr.Skip(indexOfSplit).ToArray, separator) Console.WriteLine(sFinal)
Très intelligent. Grande utilisation de .Take et .Skip Une seule variable d'index requise.
Merci @Mary. Je vais changer d’avis sur vous (vous n’avez pas que des critiques à l’intérieur, c’est confortable de penser ça). ;)
Vous pouvez diviser votre chaîne d'entrée, puis boucler le tableau des parties générées et les ajouter à un objet StringBuilder
.
Lorsque vous avez lu un nombre de parties qui est multiple d'une valeur définie, ( wordsPerLine
, ici), vous ajoutez vbNewLine
à la partie actuelle .
Une fois la boucle terminée, imprimez le contenu de StringBuilder sur la console:
SOMETHING BIGGER THAN YOUR DREAM, NOT MORE THAN YOUR ACCOUNT BALANCE
Imprime:
Dim input As String = "SOMETHING BIGGER THAN YOUR DREAM, NOT MORE THAN YOUR ACCOUNT BALANCE" Dim wordsPerLine As Integer = 3 Dim wordsCounter As Integer = 1 Dim sb As StringBuilder = New StringBuilder() For Each word As String In input.Split() sb.Append(word & If(wordsCounter Mod wordsPerLine = 0, vbNewLine, " ")) wordsCounter += 1 Next Console.WriteLine(sb.ToString())
p >
Au lieu de fractionner, vous pouvez faire correspondre 3 mots dans un groupe et les remplacer par le groupe et une nouvelle ligne
(\ S + (?: \ S + \ S +) {2}) \ s *
regex101.com/r/N2L7PS/1