2013-08-06 12 views
12

Przede wszystkim chciałbym powiedzieć, że widziałem wiele przykładów tutaj i googled, ale żaden nie znalazł, że pasuje do wszystkich warunków szukam jakiegoś meczu top 3 nie poniżej niektórych pomiędzy. Pociesz się, daj mi znać, jak umieścić je wszystkie w jednym miejscu.Regex pasujący do wszystkich formatów numerów telefonów

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

Korzystanie jako:

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

      } 

SAMPLE WYJŚCIE:

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 

Odpowiedz

31

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

+0

dziękuję za odpowiedź – confusedMind

+3

Nie ma problemu, wydaje się, że jest coraz bardziej pretensjonalna. Nie mogę powiedzieć, że jestem fanem. – FlyingStreudel

+0

hej działa idealnie :), tylko pytanie jest dobre, aby dodać ten z xxxxxxxxxx, ponieważ myślę, że może to być biorąc liczb losowych jest to możliwe? liczby analityczne Google etc? – confusedMind

6
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

Aby przedłużyć na prawidłową odpowiedź FlyingStreudel, w I zmodyfikowane go do zaakceptowania ". jako ogranicznik, który był dla mnie wymagany.

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

w użyciu (znalezienie wszystkich numerów telefonicznych w ciągu znaków):

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

Aby dodać do wszystkich powyższych sugestii, oto moja RegEx które będą egzekwować normy 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}) 

To wyrażenie regularne wymusza reguły standardowe NANP, takie jak N11 codes are used to provide three-digit dialing access to special services, a zatem wyklucza je przy użyciu warunkowego przechwytywania. Obejmuje on także do 3 znaków bez cyfr (\D{0,3}) pomiędzy sekcjami, ponieważ widziałem kilka ciekawych danych.

Z dostarczonych danych testowych, oto wyjściowa:

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 

Zauważ, że istniały dwa przykładowe wartości pominięte ze względu na nie jest ważne numery telefonów według NANP Standardy: Area Code zaczyna się od 1

1334714149 
1334431660 

Reguła, do której się odnawiam, znajduje się na stronie National NANPA, w sekcji Kod obszarów, podając: The format of an area code is NXX, where N is any digit 2 through 9 and X is any digit 0 through 9.

Powiązane problemy