2012-06-26 20 views
5

Mam listę numerów telefonów wprowadzonych przez użytkowników bez sprawdzania i wyglądają następująco:numery Normalizacja telefonu za pomocą wyrażenia regularnego

- 495) 995-0595 
- 105-6439 
- 095 268 8621 
- 324-51-44 
- 7 (495) 995-05-95 
- 7 495 995 05 95 
- 7 (495) 995-0595 
- +7 (495) 995-05-95 
- 7 (495)925-34-89 
- 7(495)9253489 
- 7(495)925-34-89 
- 74959950595 

chcę przekonwertować te numery w tym (rosyjski) Format: + X (XXX) XXX-XX-XX

Czy jest jakakolwiek szansa, aby to osiągnąć za pomocą wyrażeń regularnych?

+0

Chyba należy umieścić walidacji gdy użytkownik wprowadza dane. –

+1

Jest za późno. Mam ich już kilka tysięcy. – Roman

+6

Wygląda na to, że mamy tylko dwa scenariusze, 7 cyfr i 11 cyfr. formatowanie na bok, najpierw usuwasz całe formatowanie z listy i zapisujesz jako czyste cyfry. a następnie sformatuj go w dowolny sposób za pomocą łańcucha znaków.format: – Joe

Odpowiedz

3

Yup, Extract & Reformat!

List<string> oldlist = new List<string>(); 
List<string> newlist = new List<string>(); 
foreach(string s in oldlist) 
{ 
    if(s.Contains('(')) s = s.Replace('('), "");//etc 
    newlist.Add(numFormat(s)); 
} 

string prefix = "495"; 

string numFormat(string s) 
{ 
    string my; 
    if(s.Length == 7) 
    { 
     my = string.Format("+7 ({0}) {1} {2} {3}", prefix, s.substring(0,3), s.subtring(3,2), s.substring(5,2); 
    } 
    else if(s.length == 10) 
    { 
     my = string.Format("+7 ({0}) {1} {2} {3}", s.substring(0,3), s.substring(3,3), s.subtring(5,2), s.substring(7,2);   
    } 
    //etc 
    return my; 
} 

Jest tuż przy mojej głowie ... ale masz pomysł

1

myślę, że należy to zrobić

  1. przekonwertować go na ciąg.
  2. Użycie pętli usuwa wszystko, co nie wygląda jak liczba. Możesz użyć do tego celu Char.IsDigit().
  3. Następnie wykonaj żądane formatowanie, używając string.Substring().

Upewnij się, że wykonałeś wszystkie te kroki tylko w formacie łańcuchowym.

Jak

string str = "495) 995-0595"; 
List<char> digits = new List<char>(); 

for (int i = 0; i < str.Length; i++) 
{ 
    if(char.IsDigit(str[i])) 
     digits.Add(str[i]); 
} 

str = new string(digits.ToArray()); 

str = "+" + str.Substring(0, 1) + " (" + str.Substring(1, 3) + ") " 
     + str.Substring(4, 2) + "-" + str.Substring(6, 2) + "-" + str.Substring(8); 

ta wróciła mi "+4 (959) 95-05-95"

+0

Problem polega na tym, że brakująca paranteza w 495 r. Definiuje numer kodu miasta. Muszę więc naprawić tę miss, aby uzyskać numer telefonu w XXX-XX-XX – Roman

+2

. Myślę, że znajdziesz w Nikhilu i moim rozwiązaniu, że ignorujemy wszystkie złe formatowanie. usuwanie formatowania jest o wiele łatwiejsze niż "poprawianie" formatowania. Po prostu pobierz cyfry, a następnie nadpisz je w odpowiednim formacie. Nie myśl o próbie naprawienia każdego przypadku formatowania, nie ma nieskończonych możliwości złych przypadków. – Joe

+0

@Joe: +1 do Twojego komentarza. "Usuwanie formatowania jest dużo łatwiejsze niż" poprawianie "formatowania". Prawo –

0

Coś takiego:

(\d)? ?\(?(\d\d\d)?\)? *?(\d\d\d) *?-? *?(\d\d) *?-? *?(\d\d) 
2

uruchomić listy przez to:

var strippedNumbers = new List<string>(); 
foreach (var num in listOfRussianNumbers.Select(x=>Regex.Replace(x, "[^0-9]", ""))) 
    strippedNumbers.Add(num.Length == 7?"7499"+num:num); 

następnie użyj string.Format, aby wydrukować, jak chcesz

string.Format("+{0} ({1}) {2}-{3}-{4}", 
    num.Substring(0,1), 
    num.Substring(1,3), 
num.Substring(4,3), 
num.Substring(7,2), 
num.Substring(9,2)); 
+0

Ostatnie 3 muszą być "num.Substring (4,2), num.Substring (6,2), num.Substring (8,2));' –

+0

nie, myślę, że brakuje pierwszego numeru, więc wszystkie ciągi ur są 1 char off :) – Joe

+0

Tak, nieodebrane, przepraszam. –

1

To jest najlepsze, co mogę uzyskać w krótkim czasie.

((\+?\d)\s?)?\(?(\d\d\d)\)?\s?(\d\d\d)(\s|-)?(\d\d)(\s|-)?(\d\d) 

Spowoduje to wybranie pogrubionej próbki.

495) 995-0595
105-6439

324-51-44
7 (495) 995-05-95

7 (495) 995-0595
+7 (495) 995-05-95
7 (495) 925-34-89
7 (495) 9253489
7 (495) 925-34-89

Na strunach że dont Dopasuj, możesz wysłać je za pomocą innej procedury lub do ręcznego przetwarzania.

Powiązane problemy