2010-10-19 16 views
8

Ich habe mich nur gefragt, ob es eine einfache Möglichkeit dafür gibt. d.h. Ersetzen des Auftretens von aufeinanderfolgenden Zeichen durch dasselbe Zeichen.Ersetze aufeinanderfolgende Zeichen mit demselben einzelnen Zeichen

Für zB: - wenn meine Zeichenfolge "etwas wieeeee tttthhiiissss" ist, dann sollte meine endgültige Ausgabe "so etwas wie" sein.

Die Zeichenfolge kann auch Sonderzeichen einschließlich Leerzeichen enthalten.

Können Sie uns einige einfache Möglichkeit vorschlagen, dies zu tun.

+3

Was ist mit Situationen, in denen Wörter normalerweise aufeinanderfolgende Instanzen des gleichen Buchstabens haben? Zum Beispiel: Biene, Bier, Zuckerrüben, Treffen, Mond, bald ... –

+0

Dann würden diese Worte zu sein, ber, wette, meting, mon, und Sohn. – mquander

+0

@mquander - das weiß ich. Ich hatte gehofft, das OP dazu zu bringen, ein bisschen mehr darüber nachzudenken, etwas zu tun. –

Antwort

11

Dies sollte es tun:

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

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

Die Regex wird (.) jedes Zeichen und \\1+ dem Betrag entspricht, in der ersten Gruppe gefangen genommen wurde.

+0

Funktioniert nicht für Sonderzeichen und Leerzeichen. – MStodd

+0

True, bearbeitet, um das zu reflektieren. – alexn

+2

Danke für diese Antwort! Dies funktionierte hauptsächlich für mich, aber ich benutzte es in einer einzigen Zeile und musste das Regex-Muster als Konstante setzen, indem ich das @ -Symbol verwendete, welches das Entfernen eines der Backslashes erforderte. Ich suchte nur nach sequenziellen Bindestrichen, also sah meine eher so aus: 'str = Regex.Replace (str, @" (\ -) \ 1+ "," $ 1 ");' – dadwithkids

1

Wie wäre:

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

in Englisch, wir eine neue Zeichenfolge auf einem char [] Array basiert erstellen. Wir konstruieren, die char [] Array von ein paar LINQ Operatoren Anwendung:

  1. Select: Erfassen des Index i zusammen mit dem aktuellen Zeichen x.
  2. Charaters filtern, die
  3. Wählen Sie das Zeichen, das nicht das gleiche wie die nachfolgenden Zeichen sind x.xx aus dem anonymen Typ zurück.
  4. Zurück in ein char [] Array konvertieren, so dass wir zum Konstruktor string gelangen können.
+0

Entschuldigung, aber können Sie das etwas genauer erklären? Ich habe es nicht verstanden. –

+3

Dies ist eine LINQ-Abfrage. Ich würde nicht empfehlen, dies zu tun, was Sie versuchen zu tun. Es könnte funktionieren, aber wenn man es anschaut, hat man wirklich keine Ahnung, was die Absicht des Codes ist. – Dismissile

+2

@Dismissile, * Sie * haben vielleicht keine Ahnung, was die Absicht des Codes ist, aber das ist ziemlich subjektiv und ich stimme überhaupt nicht zu. –

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

für sollte foreach sein – MStodd

+0

@MStodd: ja. Danke, dass du das bemerkt hast. Meine Antwort wurde bearbeitet. –

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

In diesem Code das Programm;

  1. wird die Zeichenfolge lesen wie von Benutzern eingegeben

2.Convert der Zeichenfolge in char-Array mit string.ToChar()

  1. Die Schleife wird für jedes Zeichen in der Zeichenfolge

  2. ausgeführt. Jedes an dieser bestimmten Position im Array gespeicherte Zeichen wird mit dem Zeichenspeicher verglichen Ed in Position eins größer als das. Und wenn die Zeichen derselben gefunden werden, die in diesem bestimmten Array gespeicherten Zeichen würde getrimmt unter Verwendung .ToTrim()

  3. Für letzte Zeichen der Schleifenfehler-Index außerhalb des gebundenen zeigen, wie es die letzte Positionswert sein würde, des Arrays. Deshalb habe ich * verwendet if ((i = (str.length - 1))) *

6.Die Zeichen links nach in Folge in verketteten Form gespeichert trimmen.

+0

@MikaS Danke ... Fertig :) –

Verwandte Themen