129

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

正则表达式?

4

9 回答 9

258

绝对正则表达式:

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(用于扩展)的事情。

于 2008-11-04T16:54:36.227 回答
78

您可以使用正则表达式轻松完成:

string subject = "(913)-444-5555";
string result = Regex.Replace(subject, "[^0-9]", ""); // result = "9134445555"
于 2008-11-04T17:00:19.587 回答
45

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

phone = new String(phone.Where(c => char.IsDigit(c)).ToArray())
于 2014-01-09T06:32:13.863 回答
23

这是执行此操作的扩展方法。

public static class Extensions
{
    public static string ToDigitsOnly(this string input)
    {
        Regex digitsOnly = new Regex(@"[^\d]");
        return digitsOnly.Replace(input, "");
    }
}
于 2011-10-21T18:07:33.033 回答
10

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

phoneNumber  = Regex.Replace(phoneNumber, "\\D", String.Empty);
于 2008-11-04T17:07:07.327 回答
5

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

如果您确实坚持使用正则表达式选项之一,至少RegexOptions.Compiled在静态变量中使用。

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

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

于 2014-09-04T03:52:44.350 回答
4

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

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

我电脑中的结果是:
Init...
Time: 307
Time: 2178

于 2016-01-19T18:58:21.940 回答
3

我确信有一种更有效的方法可以做到这一点,但我可能会这样做:

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();
}
于 2008-11-04T16:59:13.223 回答
-1

试试这个

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();
        }
于 2008-11-04T18:47:07.343 回答