用空字符串替换非数字

在我们的项目中快速添加需求。数据库中保存电话号码的字段被设置为只允许10个字符。因此,如果我被传递“(913) -444-5555”或者其他任何东西,是否有一种快速的方法通过某种特殊的替换函数来运行字符串,我可以传递一组字符来允许它?

雷吉斯?

112058 次浏览

当然是正则表达式:

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

或者在类中,以避免一直重新创建正则表达式:

private static Regex digitsOnly = new Regex(@"[^\d]");


public static string CleanPhone(string phone)
{
return digitsOnly.Replace(phone, "");
}

根据您的实际输入,您可能需要一些额外的逻辑来做一些事情,比如去掉前导1(用于长距离)或任何尾随 X 或 X 的东西(用于扩展)。

我相信有更有效的方法,但我可能会这样做:

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

使用 regex 可以很容易地做到这一点:

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

使用.NET 中的正则表达式方法,您应该能够使用 D 来匹配任何非数字数字,如下所示:

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

试试这个

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

下面是这样做的扩展方法。

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

你不需要使用正则表达式。

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

不使用正则表达式的扩展方法怎么样。

如果您坚持使用其中一个正则表达式选项,那么至少在静态变量中使用 RegexOptions.Compiled

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

这是建立在 Usman Zfar 的答案转换为方法组的基础上的。

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

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 < BR/>