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