Ich habe ein einfaches Problem Ich habe ein Telefon wie folgt: +1 (123) 123-1234 und ich möchte nur die Zahlen aus dieser Zeichenfolge mit Regex nehmen.Wie nehme ich eine Telefonnummer mit einem Pluszeichen und einer Klammer und gebe einfach die Zahlen zurück?
Antwort
Dies wird ein nicht-numerischen Zeichen Streifen aus:
string input = "+1 (123) 123-1234";
string digits = Regex.Replace(input,@"\D",string.Empty);
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(" ", "");
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. –
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? –
+1: es ist nicht. Es ist richtig, und die "idealere" Lösung wird höher steigen. –
string digits = Regex.Replace(input, @"[^\d]", String.Empty);
\ D (Großbuchstabe D) bedeutet Nicht-Ziffern –
oh, lerne jeden Tag etwas neues. Ich nehme das heraus dann –
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();
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;) –
Und das ist ein guter Punkt zu - ich vergesse, dass nicht jeder 3.5 verwendet; Ich werde bearbeiten, um das zu reflektieren. –
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. :) –
Wird das nicht alle Ziffern entfernen? –
Danke Chris das hat ganz gut geklappt. –
\ D (Großbuchstabe D) bedeutet Nicht-Ziffern \ d (Kleinbuchstaben d) bedeutet Ziffern –