Regex соответствует всем форматам телефонных номеров

Прежде всего, я бы сказал, что я видел много примеров здесь и googled, но ни один не нашел, что соответствует всем условиям, которые я ищу, для того, чтобы соответствовать top top 3, не ниже некоторых inbetween. Пожалуйста, дайте мне знать, как положить их все в одном месте.

(xxx)xxxxxxx
(xxx) xxxxxxx
(xxx)xxx-xxxx
(xxx) xxx-xxxx
xxxxxxxxxx
xxx-xxx-xxxxx

Использование:

  const string MatchPhonePattern =
           @"\(?\d{3}\)?-? *\d{3}-? *-?\d{4}";
            Regex rx = new Regex(MatchPhonePattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
            // Find matches.
            MatchCollection matches = rx.Matches(text);
            // Report the number of matches found.
            int noOfMatches = matches.Count;
            // Report on each match.

            foreach (Match match in matches)
            {

                tempPhoneNumbers= match.Value.ToString(); ;

             }

ВЫХОД ИЗОБРАЖЕНИЯ:

3087774825
(281)388-0388
(281)388-0300
(979) 778-0978
(281)934-2479
(281)934-2447
(979)826-3273
(979)826-3255
1334714149
(281)356-2530
(281)356-5264
(936)825-2081
(832)595-9500
(832)595-9501
281-342-2452
1334431660

Ответ 1

\(?\d{3}\)?-? *\d{3}-? *-?\d{4}

Ответ 2

 public bool IsValidPhone(string Phone)
    {
        try
        {
            if (string.IsNullOrEmpty(Phone))
                return false;
            var r = new Regex(@"^\(?([0-9]{3})\)?[-.●]?([0-9]{3})[-.●]?([0-9]{4})$");
            return r.IsMatch(Phone);

        }
        catch (Exception)
        {
            throw;
        }
    }

Ответ 3

Чтобы продлить на правильный ответ FlyingStreudel, я изменил его, чтобы принять '.' как разделитель, который был для меня требованием.

\(?\d{3}\)?[-\.]? *\d{3}[-\.]? *[-\.]?\d{4}

в использовании (поиск всех телефонных номеров в строке):

string text = "...the text to search...";
string pattern = @"\(?\d{3}\)?[-\.]? *\d{3}[-\.]? *[-\.]?\d{4}";
Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
Match match = regex.Match(text);
while (match.Success)
{
    string phoneNumber = match.Groups[0].Value;
    //TODO do something with the phone number
    match = match.NextMatch();
}

Ответ 4

Чтобы добавить ко всем приведенным выше предложениям, здесь мой RegEx, который будет применять стандарты NANP:

((?:\(?[2-9](?(?=1)1[02-9]|(?(?=0)0[1-9]|\d{2}))\)?\D{0,3})(?:\(?[2-9](?(?=1)1[02-9]|\d{2})\)?\D{0,3})\d{4})

Это регулярное выражение применяет стандартные правила NANP, такие как N11 codes are used to provide three-digit dialing access to special services, и таким образом исключает их с помощью условного захвата. Он также учитывает до 3 нецифровых символов (\D{0,3}) между разделами, потому что я видел некоторые фанковые данные.

Из предоставленных данных тестирования здесь: Выход:

3087774825
(281)388-0388
(281)388-0300
(979) 778-0978
(281)934-2479
(281)934-2447
(979)826-3273
(979)826-3255
(281)356-2530
(281)356-5264
(936)825-2081
(832)595-9500
(832)595-9501
281-342-2452

Обратите внимание, что из-за того, что не были действительными номерами телефонов по стандартам NANP, было отклонено два образца: Код области начинается с 1

1334714149
1334431660

Правило, на которое я имею в виду, можно найти на странице веб-сайта Национальной веб-страницы NANPA, содержащей The format of an area code is NXX, where N is any digit 2 through 9 and X is any digit 0 through 9.