2008-11-04 5 views
101

Быстрое добавление требования в нашем проекте. Поле в нашей БД для хранения номера телефона настроено только на 10 символов. Итак, если мне передают «(913) -444-5555» или что-то еще, есть ли быстрый способ запустить строку через какую-то специальную функцию замены, чтобы я мог передать ей набор символов для разрешения?Заменить нечисловую пустую строку

Regex?

ответ

206

Определенно регулярное выражение:

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 (для расширений).

+0

Отлично. Это используется только пару раз, поэтому нам не нужно создавать класс, а ведущий 1 - неплохая идея. Но я думаю, что я бы лучше справился с этим в каждом конкретном случае, по крайней мере, в этом проекте. Еще раз спасибо - если бы я мог снова подняться, я бы это сделал. – 2008-11-04 17:01:30

+1

Я жду, когда кто-то опубликует версию метода расширения для этого класса строк :) – 2008-11-04 17:33:23

+0

@Joel Я добавил версию метода расширения ниже. Угадайте, что комментарии не поддерживают уценку. – Aaron 2011-10-21 18:07:49

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

Это был мой первый инстинкт, и поэтому я спросил здесь. RegEx выглядит намного лучше для меня. Но спасибо за ответ! – 2008-11-04 17:03:53

65

Вы можете сделать это легко с регулярным выражением:

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

Используя Regex методы в .NET вы должны быть в состоянии соответствовать любой нечисловой цифру с помощью \ D, например, так:

phoneNumber = Regex.Replace(phoneNumber, "\D", ""); 
-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(); 
     } 
21

Это способ расширения.

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

Вам не нужно использовать регулярное выражение.

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

Как насчет метода расширения, который не использует регулярное выражение.

Если вы придерживаетесь одного из вариантов Regex, по крайней мере, используйте RegexOptions.Compiled в статической переменной.

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

Это связано с ответом Усмана Зафара, преобразованным в группу методов.

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 ...
Время: 307
Время: 2178