Как взять номер телефона с плюсом и скобкой и просто вернуть цифры? - PullRequest
2 голосов
/ 22 апреля 2009

У меня есть простая проблема, у меня такой телефон: +1 (123) 123-1234, и я хочу просто извлечь числа из этой строки с помощью регулярных выражений.

Ответы [ 4 ]

13 голосов
/ 22 апреля 2009

Это исключит нечисловые символы:

string input = "+1 (123) 123-1234";
string digits = Regex.Replace(input,@"\D",string.Empty);
6 голосов
/ 22 апреля 2009

Использование RegEx является одним из решений. Другой способ - использовать LINQ (при условии, что вы используете .Net 3.5)

    string myPhone = "+1 (123) 123-1234";
    string StrippedPhone = new string((from c in myPhone
                                       where Char.IsDigit(c)
                                       select c).ToArray());

Конечный результат тот же, но я думаю, что LINQ предлагает некоторые преимущества по сравнению с RegEx в этом случае. Во-первых, читаемость. RegEx требует, чтобы вы знали, что «D» означает «не цифра» (по сравнению с Char.IsDigit ()) - здесь есть путаница в комментариях. Кроме того, я сделал очень простой тест, выполняя каждый метод 100 000 раз.

LINQ: 127 мс

RegEx: 485 мс

Итак, на первый взгляд кажется, что LINQ out выполняет Regex в этой ситуации. И я бы сказал, что это более читабельно.

    int i;
    int TIMES = 100000;
    Stopwatch sw = new Stopwatch();
    string myPhone = "+1 (123) 123-1234";

    // Using LINQ            
    sw.Start();
    for (i = 0; i < TIMES; i++)
    {
        string StrippedPhone = new string((from c in myPhone
                                           where Char.IsDigit(c)
                                           select c).ToArray());
    }
    sw.Stop();
    Console.WriteLine("Linq took {0}ms", sw.ElapsedMilliseconds);

    // Reset 
    sw.Reset();

    // Using RegEx
    sw.Start();
    for (i = 0; i < TIMES; i++)
    {
        string digits = Regex.Replace(myPhone, @"\D", string.Empty);
    }
    sw.Stop();
    Console.WriteLine("RegEx took {0}ms", sw.ElapsedMilliseconds);

    Console.ReadLine();
2 голосов
/ 22 апреля 2009
string digits = Regex.Replace(input, @"[^\d]", String.Empty);
0 голосов
/ 22 апреля 2009

Почему бы просто не сделать замену?

string phoneNumber = "+1 (123) 123-1234";
phoneNumber = phoneNumber.Replace("+", "");
phoneNumber = phoneNumber.Replace("(", "");
phoneNumber = phoneNumber.Replace(")", "");
phoneNumber = phoneNumber.Replace("-", "");
phoneNumber = phoneNumber.Replace(" ", "");
...