2012-06-26 21 views
5

que tienen una lista de números de teléfono introducidos por los usuarios sin la validación y se ven como:números de teléfono Normalizar utilizando expresiones regulares

- 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 

Quiero convertir estos números en este formato (en ruso): + X (XXX) XXX-XX-XX

¿Hay alguna posibilidad de lograrlo con expresiones regulares?

+0

Creo que se debe poner la validación cuando el usuario está ingresando datos. –

+1

Es muy tarde. Tengo varios miles de ellos ahora. – Roman

+6

parece que solo tienes dos escenarios, 7 dígitos y 11 dígitos. Dejando de lado el formato, primero debe quitar todo el formato de su lista y almacenarlo como números puros. luego formatéalo de la forma que quieras con string.format – Joe

Respuesta

3

Yup, extracto & 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; 
} 

Esto es justo al lado de la parte superior de mi cabeza ... pero usted consigue la idea

1

Creo que deberías hacer esto

  1. convertirlo en cadena.
  2. Usando Loop, elimine todo lo que no se parezca al número. Puede usar Char.IsDigit() para esto.
  3. Luego haga su formateo deseado usando string.Substring().

Asegúrese de realizar todos estos pasos solo en el formato de cadena.

Como

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

Esto me volvió "+4 (959) 95-05-95"

+0

El problema es que la ausencia de la ronda en el 495) define el número del código de la ciudad. Así que tengo que arreglar esta falla también, para obtener el número de teléfono en XXX-XX-XX – Roman

+2

, creo que encontrará tanto en Nikhil como en mi solución que ignoramos todo el formato incorrecto. pelar el formateo es mucho más fácil que 'arreglar' el formateo. Simplemente tome los números y luego sobrescríbalo en el formato correcto. No piense en tratar de corregir cada caso de formato individual, hay infinitas posibilidades de casos malos. – Joe

+0

@Joe: +1 a tu comentario. "Eliminar el formateo es mucho más fácil que 'arreglar' el formateo". Derecha –

0

Algo así:

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

ejecutar su lista a través de esto:

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

A continuación, utilice cadena.Formato para imprimirlo como quiera

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

Los últimos 3 deben ser 'num.Substring (4,2), num.Substring (6,2), num.Substring (8,2));' –

+0

no, creo que te falta el primer número, así que todas las cadenas de ur son 1 char off :) – Joe

+0

Sí se perdió eso Lo siento. –

1

Esto es lo mejor que puedo obtener a corto plazo.

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

Esto seleccionará el en negrita de su muestra.

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

en las cuerdas que No partido, puede enviarlos a través de una rutina diferente o para el procesamiento manual.

Cuestiones relacionadas