2010-10-19 11 views
8

Me preguntaba si hay una forma simple de hacerlo. es decir, reemplazar la aparición de caracteres consecutivos con el mismo personaje.Reemplazar caracteres consecutivos con el mismo carácter individual

Por ejemplo: - si mi cadena es "algo así comoeeee tttthhiiissss" entonces mi salida final debería ser "algo como esto".

La cadena también puede contener caracteres especiales, incluido el espacio.

¿Pueden ustedes sugerir alguna manera simple de hacer esto.

+3

¿Qué pasa con las situaciones donde las palabras normalmente tienen instancias consecutivas de la misma letra? Por ejemplo: abeja, cerveza, remolacha, reunión, luna, pronto ... –

+0

Entonces esas palabras se convertirían en be, ber, bet, meting, mon e son. – mquander

+0

@mquander - Lo sé. Esperaba que el OP pensara un poco más sobre hacer algo así. –

Respuesta

11

Esto debe hacerlo:

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

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

La expresión regular coincidirá con cualquier carácter (.) y \\1+ coincidirá con lo que fue capturado en el primer grupo.

+0

No funciona para caracteres especiales y espacios en blanco. – MStodd

+0

Verdadero, editado para reflejar eso. – alexn

+2

¡Gracias por esta respuesta! Esto en su mayoría funcionó para mí, pero terminé usándolo en una sola línea y tuve que establecer el patrón de expresiones regulares como una constante usando el símbolo @, que requería eliminar una de las barras invertidas. Solo buscaba guiones secuenciales, así que el mío se parecía más a esto: 'str = Regex.Replace (str, @" (\ -) \ 1+ "," $ 1 ");' – dadwithkids

1

¿Qué tal:

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 Inglés, estamos creando una nueva cadena basada en una matriz de caracteres []. Construimos que char [] array mediante la aplicación de unos pocos operadores LINQ:

  1. Select: capturar el índice de i, junto con el carácter actual x.
  2. Filtro cabo charaters que no son lo mismo que el carácter siguiente
  3. Seleccione el carácter x.x a salir del tipo anónimo x.
  4. Convertir de nuevo a una matriz char [] para que podamos pasar al constructor de string.
+0

Lamento preguntar, pero ¿puedes explicar esto con un poco más de detalle? No entendi. –

+3

Esta es una consulta LINQ. No recomendaría usar esto para hacer lo que estás tratando de hacer. Podría funcionar, pero mirándolo no tienes idea de cuál es la intención del código. – Dismissile

+2

@Dismissile, * usted * podría no tener idea de cuál es la intención del código, pero eso es bastante subjetivo y estoy totalmente en desacuerdo. –

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

para debe ser foreach – MStodd

+0

@MStodd: sí. Gracias por notar eso Mi respuesta ha sido editada. –

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

En este código, el programa;

  1. leerá la cadena como entrado por el usuario

2.Convert la cadena en matriz de caracteres usando string.ToChar()

  1. El ciclo se ejecutará para cada carácter en la cadena

  2. cada carácter almacenado en esa posición particular en el conjunto se comparará con el carácter stor ed en la posición uno mayor que eso. Y si los personajes se encuentran misma el carácter almacenado en esa matriz en particular podría ser recortado utilizando .ToTrim()

  3. Por último carácter del bucle mostrará el error de índice fuera de límite, ya que sería el último valor de posición de la matriz. Es por eso que he usado * if ((i = (str.length - 1))) *

6.El caracteres que queda después de recortar se almacenan en consecuencia en forma concatenada.

+0

@MikaS Gracias ... Hecho :) –

Cuestiones relacionadas