用空stringreplace非数字

在我们的项目中快速添加需求。 我们的数据库中的一个字段用于保存一个电话号码,只允许有10个字符。 所以,如果我通过“(913)-444-5555”或其他任何东西,有没有一种快捷的方式来运行一个string通过某种特殊的replacefunction,我可以通过它的一组字符允许?

正则expression式?

绝对正则expression式:

string CleanPhone(string phone) { Regex digitsOnly = new Regex(@"[^\d]"); return digitsOnly.Replace(phone, ""); } 

或者在一个类中,以避免重新创build正则expression式:

 private static Regex digitsOnly = new Regex(@"[^\d]"); public static string CleanPhone(string phone) { return digitsOnly.Replace(phone, ""); } 

根据你的真实世界的input,你可能需要一些额外的逻辑去做一些事情,如去掉前导1(用于长距离)或者任何跟随x或X(用于扩展)的东西。

你可以用regex轻松做到这一点:

 string subject = "(913)-444-5555"; string result = Regex.Replace(subject, "[^0-9]", ""); // result = "9134445555" 

你不需要使用正则expression式。

 phone = new String(phone.Where(c => char.IsDigit(c)).ToArray()) 

这是扩展方法。

 public static class Extensions { public static string ToDigitsOnly(this string input) { Regex digitsOnly = new Regex(@"[^\d]"); return digitsOnly.Replace(input, ""); } } 

在.NET中使用Regex方法,你应该能够使用\ D来匹配任何非数字的数字,如下所示:

 phoneNumber = Regex.Replace(phoneNumber, "\D", ""); 

如何不使用正则expression式的扩展方法。

如果你坚持使用RegexOptions.Compiled则expression式选项,至lessRegexOptions.Compiled在静态variables中使用RegexOptions.Compiled

 public static string ToDigitsOnly(this string input) { return new String(input.Where(char.IsDigit).ToArray()); } 

这build立在Usman Zafar的答案转换为一个方法组。

为了获得最佳性能和更低的内存消耗,请尝试以下操作

 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, ""); } } 

我的电脑里的结果是:
在里面…
时间:307
时间:2178

我相信有一个更有效的方法来做到这一点,但我可能会这样做:

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

尝试这个

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