Ersetzen Sie nicht-numerische mit leeren String
-
06-07-2019 - |
Frage
Schnell auf Anforderung in unserem Projekt hinzufügen. Ein Feld in unserer DB eine Telefonnummer zu halten ist auf nur 10 Zeichen zu ermöglichen. Also, wenn ich bekomme bestanden „(913) -444-5555“ oder irgendetwas anderes, gibt es eine schnelle Möglichkeit, eine Zeichenfolge durch eine Art von Sonder ersetzen Funktion auszuführen, dass ich ihm eine Reihe von Zeichen passieren kann zulassen?
Regex?
Lösung
Auf jeden Fall regex:
string CleanPhone(string phone)
{
Regex digitsOnly = new Regex(@"[^\d]");
return digitsOnly.Replace(phone, "");
}
oder innerhalb einer Klasse neu zu erstellen, die Regex der ganzen Zeit zu vermeiden
private static Regex digitsOnly = new Regex(@"[^\d]");
public static string CleanPhone(string phone)
{
return digitsOnly.Replace(phone, "");
}
Abhängig von Ihren realen Welt-Eingängen, können Sie einige zusätzliche Logik dort wollen die Dinge zu tun, wie Streifen aus führendem 1'en (für Ferngespräche) oder irgendetwas ein x oder X (für Erweiterungen) nachlauf.
Andere Tipps
Sie können es leicht mit regex:
string subject = "(913)-444-5555";
string result = Regex.Replace(subject, "[^0-9]", ""); // result = "9134445555"
Sie brauchen nicht Regex zu verwenden.
phone = new String(phone.Where(c => char.IsDigit(c)).ToArray())
Hier ist die Erweiterung Methode Art und Weise, es zu tun.
public static class Extensions
{
public static string ToDigitsOnly(this string input)
{
Regex digitsOnly = new Regex(@"[^\d]");
return digitsOnly.Replace(input, "");
}
}
die Regex Methoden in .NET verwenden, sollten Sie in der Lage sein, jede nicht-numerische Ziffer mit \ D übereinstimmen, etwa so:
phoneNumber = Regex.Replace(phoneNumber, "\D", "");
Wie wäre eine Erweiterung Methode, die nicht regex nicht verwendet.
Wenn Sie nicht halten Sie sich an eine der Regex-Optionen zumindest Verwendung RegexOptions.Compiled
in den statischen Variablen.
public static string ToDigitsOnly(this string input)
{
return new String(input.Where(char.IsDigit).ToArray());
}
Diese baut auf Usman Zafar Antwort auf eine Methodengruppe umgewandelt wird.
für die beste Leistung und geringerer Speicherverbrauch, versuchen Sie dies:
using System;
using System.Diagnostics;
using System.Text;
using System.Text.RegularExpressions;
public class Program
{
private static Regex digitsOnly = new Regex(@"[^\d]");
public static void Main()
{
Console.WriteLine("Init...");
string phone = "001-12-34-56-78-90";
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000000; i++)
{
DigitsOnly(phone);
}
sw.Stop();
Console.WriteLine("Time: " + sw.ElapsedMilliseconds);
var sw2 = new Stopwatch();
sw2.Start();
for (int i = 0; i < 1000000; i++)
{
DigitsOnlyRegex(phone);
}
sw2.Stop();
Console.WriteLine("Time: " + sw2.ElapsedMilliseconds);
Console.ReadLine();
}
public static string DigitsOnly(string phone, string replace = null)
{
if (replace == null) replace = "";
if (phone == null) return null;
var result = new StringBuilder(phone.Length);
foreach (char c in phone)
if (c >= '0' && c <= '9')
result.Append(c);
else
{
result.Append(replace);
}
return result.ToString();
}
public static string DigitsOnlyRegex(string phone)
{
return digitsOnly.Replace(phone, "");
}
}
Das Ergebnis ist in meinem Computer ist:
Init ...
Zeit: 307
Zeit: 2178
Ich bin sicher, dass es eine effizientere Art und Weise, es zu tun, aber ich würde dies wahrscheinlich tun:
string getTenDigitNumber(string input)
{
StringBuilder sb = new StringBuilder();
for(int i - 0; i < input.Length; i++)
{
int junk;
if(int.TryParse(input[i], ref junk))
sb.Append(input[i]);
}
return sb.ToString();
}
try this
public static string cleanPhone(string inVal)
{
char[] newPhon = new char[inVal.Length];
int i = 0;
foreach (char c in inVal)
if (c.CompareTo('0') > 0 && c.CompareTo('9') < 0)
newPhon[i++] = c;
return newPhon.ToString();
}