2009-04-21 5 views

Antwort

13

Dies wird ein nicht-numerischen Zeichen Streifen aus:

string input = "+1 (123) 123-1234"; 
string digits = Regex.Replace(input,@"\D",string.Empty); 
+0

Wird das nicht alle Ziffern entfernen? –

+0

Danke Chris das hat ganz gut geklappt. –

+3

\ D (Großbuchstabe D) bedeutet Nicht-Ziffern \ d (Kleinbuchstaben d) bedeutet Ziffern –

-2

Warum nicht einfach eine ersetzen?

string phoneNumber = "+1 (123) 123-1234"; 
phoneNumber = phoneNumber.Replace("+", ""); 
phoneNumber = phoneNumber.Replace("(", ""); 
phoneNumber = phoneNumber.Replace(")", ""); 
phoneNumber = phoneNumber.Replace("-", ""); 
phoneNumber = phoneNumber.Replace(" ", ""); 
+0

Weil du so gerade 6 Saiten erstellt hast. http://bit.ly/fi0Rq Ein String-Objekt wird als unveränderlich (schreibgeschützt) bezeichnet, da sein Wert nach seiner Erstellung nicht mehr geändert werden kann. Methoden, die scheinbar ein String-Objekt ändern, geben tatsächlich ein neues String-Objekt zurück, das die Änderung enthält. Wenn es erforderlich ist, den tatsächlichen Inhalt eines stringähnlichen Objekts zu ändern, verwenden Sie die System.Text.StringBuilder-Klasse. –

+1

Und? Vorzeitige Optimierung (außer in den 2% der Fälle) ... Sie kennen den Deal. Ehrlich, warum ist eine einfache (wenn grobe Antwort) zwei Stimmen wert? –

+0

+1: es ist nicht. Es ist richtig, und die "idealere" Lösung wird höher steigen. –

2
string digits = Regex.Replace(input, @"[^\d]", String.Empty); 
+0

\ D (Großbuchstabe D) bedeutet Nicht-Ziffern –

+0

oh, lerne jeden Tag etwas neues. Ich nehme das heraus dann –

6

regex ist eine Lösung. Eine weitere Möglichkeit, LINQ zu verwenden wäre (vorausgesetzt, Sie verwenden .Net 3,5)

string myPhone = "+1 (123) 123-1234"; 
    string StrippedPhone = new string((from c in myPhone 
             where Char.IsDigit(c) 
             select c).ToArray()); 

Das Endergebnis ist das gleiche, aber ich denke, LINQ einige Vorteile gegenüber RegEx in diesem Fall bietet. Erstens, Lesbarkeit. Die RegEx erfordert, dass Sie wissen, dass "D" bedeutet Nicht-Ziffer (im Vergleich zu Char.IsDigit()) - es gibt Verwirrung darüber bereits in den Kommentaren hier. Außerdem habe ich einen sehr einfachen Benchmark durchgeführt, der jede Methode 100.000 Mal durchgeführt hat.

LINQ: 127ms

RegEx: 485ms

Also, bei einem schnellen Blick scheint es, wie LINQ aus Regex in dieser Situation führt. Und ich würde argumentieren, dass es lesbarer ist.

int i; 
    int TIMES = 100000; 
    Stopwatch sw = new Stopwatch(); 
    string myPhone = "+1 (123) 123-1234"; 

    // Using LINQ    
    sw.Start(); 
    for (i = 0; i < TIMES; i++) 
    { 
     string StrippedPhone = new string((from c in myPhone 
              where Char.IsDigit(c) 
              select c).ToArray()); 
    } 
    sw.Stop(); 
    Console.WriteLine("Linq took {0}ms", sw.ElapsedMilliseconds); 

    // Reset 
    sw.Reset(); 

    // Using RegEx 
    sw.Start(); 
    for (i = 0; i < TIMES; i++) 
    { 
     string digits = Regex.Replace(myPhone, @"\D", string.Empty); 
    } 
    sw.Stop(); 
    Console.WriteLine("RegEx took {0}ms", sw.ElapsedMilliseconds); 

    Console.ReadLine(); 
+1

Wahr, und +1 für das, es ist ziemlich nett und elegant, aber das OP kann möglicherweise .NET 3.5 an dieser Stelle nicht verwenden;) –

+0

Und das ist ein guter Punkt zu - ich vergesse, dass nicht jeder 3.5 verwendet; Ich werde bearbeiten, um das zu reflektieren. –

+1

auch, nur um Ihren Punkt weiter zu betonen, "D" bedeutet "NON-Ziffer", nicht Ziffer .. also ja, Char.IsDigit() scheint auch für mich lesbarer zu sein. Die Regex-Lösung ist jedoch prägnant. :) –