1
votes

Nouvelle ligne de chaîne divisée après 3 espaces dans VB.net

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


1 commentaires

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


4 Réponses :


0
votes

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)


3 commentaires

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.



0
votes

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


0 commentaires

1
votes

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)


2 commentaires

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). ;)



1
votes

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 >


0 commentaires