Comment scinde une chaîne en préservant l'ensemble des mots?
J'ai besoin de diviser longue phrase en parties préservant les mots entiers. Chaque partie doit avoir donné le nombre maximum de caractères (incluant les espaces, points, etc.).
Par exemple:
int partLenght = 35;
string sentence = "Silver badges are awarded for longer term goals. Silver badges are uncommon."
De sortie:
1 part: "Silver badges are awarded for"
2 part: "longer term goals. Silver badges are"
3 part: "uncommon."
Êtes-vous essayer de mettre en œuvre un word-wrap algorithme ?
Votre exemple est mauvais par la route :).... La partie 2 ne doivent pas contenir de "sont" comme ma solution.
l'étape 1 de split en utilisant le compte tenu de la longueur et de l'étape 2 de la condition et de vérifier un mot.
Votre exemple est mauvais par la route :).... La partie 2 ne doivent pas contenir de "sont" comme ma solution.
l'étape 1 de split en utilisant le compte tenu de la longueur et de l'étape 2 de la condition et de vérifier un mot.
OriginalL'auteur jlp | 2010-12-09
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
OriginalL'auteur Tomas Jansson
Je savais qu'il y avait une belle LINQ-y façon de le faire, si elle est ici pour le plaisir:
Évidemment, ce code ne fonctionne que tant que la requête n'est pas parallèle, car elle dépend de
charCount
être incrémenté "dans l'ordre des mots".on dirait que vous devez changement de g à g.toArray() dans la chaîne.Rejoignez l'appel
Il y a un bug dans cette, de voir @JonLord la réponse ci-dessous: stackoverflow.com/a/17571171/364
peut-être vous avez besoin de changer le split.Net Framework v4.5 formulaire
input.Split(' ', StringSplitOptions.RemoveEmptyEntries)
àinput.Split(new []{' '}, StringSplitOptions.RemoveEmptyEntries)
OriginalL'auteur Jon
J'ai testé de Jon et de Lessan réponses, mais elles ne fonctionnent pas correctement si votre longueur maximale doit être absolue, plutôt que de façon approximative. Comme leur compteur s'incrémente, il ne compte pas l'espace vide à gauche à la fin d'une ligne.
L'exécution de leur code par rapport à l'OP de l'exemple, on obtient:
Le "sont" sur la ligne deux, devrait être sur la ligne trois. Cela se produit parce que le compteur ne comprend pas les 6 caractères à partir de la fin de la ligne.
Je suis venu avec la modification suivante de Lessan réponse pour tenir compte de cela:
string[] textes = texte.Wrap (50); , c'est parfait merci
A encore un bug. Passer la chaîne "the quick brown fox jumps over the lazy" et un maximum de 20. Il doit retourner 2 lignes de 19 longueur, mais il renvoie 3 lignes. Il ya de la place pour " fox " sur la première ligne, faire de la place pour le reste de la chaîne sur la deuxième ligne. Peut-être plus simple à comprendre non-linq version serait moins cool, mais en fait de produire du code qui fonctionne? Trois personnes dans cette question, seul ont essayé et échoué 😉
OriginalL'auteur JonLord
Fractionner la chaîne avec un
(de l'espace), que de construire de nouvelles chaînes à partir de la matrice résultante, l'arrêt avant votre limite pour chaque nouveau segment.
Non testé pseudo-code:
OriginalL'auteur Oded
Au début, je pensais cela pourrait être une Regex genre de chose, mais voici mon essai:
OriginalL'auteur Joel Etherton
Expansion sur de jon réponse ci-dessus; j'avais besoin pour passer
g
avecg.toArray()
, et aussi changermax
à(max + 2)
pour obtenir une exacte d'habillage sur le max-ième caractère.Et voici un exemple de l'utilisation des tests NUnit:
OriginalL'auteur Lessan Vaezi
Joel il y a un petit bug dans votre code que j'ai corrigé ici:
OriginalL'auteur bluee
Cela fonctionne:
Il me donne:
OriginalL'auteur Enigmativity
Tout CsConsoleFormat† a été principalement conçu pour le format texte pour la console, il prend en charge la génération de texte brut.
Et, si vous avez réellement besoin garni de cordes, comme dans votre question:
En plus de word wrap sur des espaces, vous obtenez la bonne manipulation des tirets, des espaces de largeur nulle, no-break espaces etc.
† CsConsoleFormat a été développé par moi.
OriginalL'auteur Athari