2009-08-05 9 views
4

je dois raccourcir une chaîne vers le bas ..180 premiers caractères d'une chaîne se terminant par un mot

Disons que nous avons une chaîne avec la longueur 500.

Je veux que la première partie de celui-ci - max 180 caractères, se terminant par le dernier mot avant d'atteindre le 180. Je ne veux pas couper la chaîne au milieu d'un mot.

Comment cela est-il réalisé? ça n'a pas à fonctionner aussi bien ... c'est quelque chose qui arrive quelques fois par jour, pas plus.

Répondre

21

Une façon vraiment facile est d'utiliser cette regex:

string trimmed = Regex.Match(input,@"^.{1,180}\b").Value; 

Le seul problème avec celui est qu'il pourrait contenir des espaces de fuite. Pour résoudre ce problème, nous pouvons ajouter un peu de look-behind négatif:

Cela devrait faire l'affaire.

+0

C'est un bon! –

+0

vous avez écrit 18 au lieu de 180 dans votre deuxième expression, ce qui fonctionne parfaitement bien :) –

+0

l'a réparé! merci d'avoir remarqué –

3

Que diriez-vous de regarder char 180, et revenir en arrière pour trouver le premier char dans (disons espace, virgule, exclamation, etc) indiquant le début du mot précédent?

+0

Pourquoi utiliser un traitement itératif quand il y a des outils intégrés pour trouver ce que vous cherchez? – Hooloovoo

+0

+! travaille pour moi et probablement rapide. – kenny

0

Conceptially

Vérifiez que la chaîne est de plus de 180 caractères. Saisissez les 180 premiers caractères en tant que sous-chaîne.

Renvoyez ce dont vous avez besoin en utilisant la méthode "LastIndexOf" pour obtenir la longueur de la chaîne combinée avec une sous-chaîne pour retourner la chaîne appropriée.

Dans le code:

 string InString; 

     InString = "Your long string goes here"; 

     if (InString.Length>180) //Check the string length 
     { 
      InString = InString.Substring(0, 180); //Get the first 180 chars 
      InString = InString.Substring(0,InString.LastIndexOf(" ")); //Stop at the last space 
     } 

Cela devrait retourner la chaîne correcte; mais LastIndexOfAny vous permettra d'ajouter d'autres caractères à votre liste EOL.

0

Vous utilisez simplement les commandes normales de la classe de chaîne:

string short = myStr.Substring(0, 180); 
int end = short.LastIndexOfAny(new char[] {' ', '\t', '\n'}); //maybe more 
return short.Substring(0, end); 
+1

Je pense que vous vouliez utiliser la méthode LastIndexOfAny - de cette façon, vous n'incluez que le premier mot. – kastermester

+0

Ah oui, vive @kastermester. Corrigée. – Grzenio

Questions connexes