2010-10-19 5 views
8

Je me demandais simplement s'il existait un moyen simple de le faire. c'est-à-dire en remplaçant l'occurrence de caractères consécutifs avec le même caractère. Par exemple: - si ma chaîne est "quelque chose comme", mon résultat final devrait être "quelque chose comme ça".Remplacer les caractères consécutifs par le même caractère

La chaîne peut contenir des caractères spéciaux, y compris l'espace.

Pouvez-vous suggérer un moyen simple de faire cela.

+3

Qu'en est-il des situations où les mots ont normalement des occurrences consécutives de la même lettre? Par exemple: abeille, bière, betterave, réunion, lune, bientôt ... –

+0

Alors ces mots deviendraient be, ber, bet, meting, mon et fils. – mquander

+0

@mquander - Je le sais. J'espérais inciter l'OP à réfléchir un peu plus à une action similaire. –

Répondre

11

Cela devrait le faire:

var regex = new Regex("(.)\\1+"); 
var str = "something likeeeee!! tttthhiiissss"; 

Console.WriteLine(regex.Replace(str, "$1")); // something like! this 

Le regex correspond à tout caractère (.) et \\1+ correspondra à tout ce qui a été capturé dans le premier groupe.

+0

Ne fonctionne pas pour les caractères spéciaux et les espaces. – MStodd

+0

True, édité pour refléter cela. – alexn

+2

Merci pour cette réponse! Cela a surtout fonctionné pour moi, mais j'ai fini par l'utiliser dans une seule ligne et avoir à définir le motif regex comme une constante en utilisant le symbole @, ce qui nécessitait de supprimer l'une des barres obliques inverses. Je ne cherchais que des tirets séquentiels, donc le mien ressemblait plus à ceci: 'str = Regex.Replace (str, @" (\ -) \ 1+ "," $ 1 ");' – dadwithkids

1

Que diriez-vous:

s = new string(s 
    .Select((x, i) => new { x, i }) 
    .Where(x => x.i == s.Length - 1 || s[x.i + 1] != x.x) 
    .Select(x => x.x) 
    .ToArray()); 

En anglais, nous créons une nouvelle chaîne basée sur un tableau de caractères []. Nous construisons que char [] tableau en appliquant quelques opérateurs LINQ:

  1. Select: capture l'indice i ainsi que le caractère actuel x.
  2. filtrer charaters qui ne sont pas les mêmes que le caractère suivant
  3. Sélectionnez le caractère x.x arrière de type anonyme x.
  4. Convertissez de nouveau en un tableau char [] pour pouvoir passer au constructeur de string.
+0

Désolé de demander, mais pouvez-vous expliquer cela un peu plus en détail? Je n'ai pas compris. –

+3

Ceci est une requête LINQ. Je ne recommanderais pas d'utiliser ceci pour faire ce que vous essayez de faire. Cela pourrait marcher, mais en regardant cela, vous n'avez aucune idée de l'intention du code. – Dismissile

+2

@Dismissile, * vous * n'avez peut-être aucune idée de l'intention du code, mais c'est plutôt subjectif et je ne suis pas du tout d'accord. –

2
string myString = "something likeeeee tttthhiiissss"; 

char prevChar = ''; 
StringBuilder sb = new StringBuilder(); 
foreach (char chr in myString) 
{ 
    if (chr != prevChar) { 
     sb.Append(chr); 
     prevChar = chr; 
    } 
} 
+1

pour devrait être foreach – MStodd

+0

@MStodd: oui. Merci d'avoir remarqué ça. Ma réponse a été éditée. –

0
 Console.WriteLine("Enter any string"); 
     string str1, result="", str = Console.ReadLine(); 
     char [] array= str.ToCharArray(); 
     int i=0; 
     for (i = 0; i < str.Length;i++) 
     { 
      if ((i != (str.Length - 1))) 
      { if (array[i] == array[i + 1]) 
      { 
       str1 = str.Trim(array[i]); 
      } 
      else 
      { 
       result += array[i]; 
      } 
      } 
      else 
      { 
      result += array[i]; 
      }      
     } 
     Console.WriteLine(result); 

Dans ce code le programme;

  1. lira la chaîne comme entrée d'un utilisateur

2.Convert la chaîne en tableau de caractères en utilisant string.ToChar()

  1. La boucle sera exécutée pour chaque caractère dans la chaîne

  2. chaque caractère stocké dans cette position particulière dans le tableau sera comparé au caractère stor ed en position un plus grand que cela. Et si les personnages se trouvent même le caractère stocké dans ce tableau particulier serait coupé à l'aide .ToTrim()

  3. Pour le dernier caractère de la boucle montrera erreur de l'indice hors limite que ce serait la dernière valeur de position du tableau. Voilà pourquoi je * if ((i = (str.Length - 1))) *

6.Les caractères à gauche après la coupe sont stockés dans le résultat sous forme concaténée.

+0

@MikaS Merci ... Fait :) –

Questions connexes