2010-03-31 204 views
5

Aquí está mi problema:java validación del número de teléfono

Crear un constructor para un número de teléfono dado una cadena de la forma xxx-xxx-xxxx o xxx-xxxx para un número local. Lanza una excepción si el formato no es válido.

Así que estaba pensando en validarlo usando una expresión regular, pero no sé si lo estoy haciendo correctamente. Además, ¿qué tipo de excepción tendría que lanzar? ¿Debo crear mi propia excepción?

public TelephoneNumber(String aString){ 
     if(isPhoneNumberValid(aString)==true){ 
      StringTokenizer tokens = new StringTokenizer("-"); 
      if(tokens.countTokens()==3){ 
       areaCode = Integer.parseInt(tokens.nextToken()); 
       exchangeCode = Integer.parseInt(tokens.nextToken()); 
       number = Integer.parseInt(tokens.nextToken()); 
      } 
      else if(tokens.countTokens()==2){ 
       exchangeCode = Integer.parseInt(tokens.nextToken()); 
       number = Integer.parseInt(tokens.nextToken()); 
      } 
      else{ 
       //throw an excemption here 
      } 
     } 

    } 


public static boolean isPhoneNumberValid(String phoneNumber){ 
    boolean isValid = false; 

    //Initialize reg ex for phone number. 
    String expression = "(\\d{3})(\\[-])(\\d{4})$"; 
    CharSequence inputStr = phoneNumber; 
    Pattern pattern = Pattern.compile(expression); 
    Matcher matcher = pattern.matcher(inputStr); 
    if(matcher.matches()){ 
     isValid = true; 
    } 
     return isValid; 
    } 

Hola lo siento, sí, esta es la tarea. Para estas asignaciones, el único formato válido son xxx-xxx-xxxx y xxx-xxxx, todos los demás formatos (xxx) xxx-xxxx o xxxxxxxxxx no son válidos en este caso.

me gustaría saber si mi expresión regular es correcto

+4

es esta tarea? debería etiquetarse como tal en caso afirmativo ... – Brabster

+0

Pregunta obvia: ¿Está seguro de que el formato de su número de teléfono capta cualquier variedad de número de teléfono que los usuarios deseen introducir? Nada es más frustrante que un sistema medio inteligente que se niega a aceptar datos perfectamente válidos. (Ah, y si esto es solo tarea, no importa.) – Tomalak

+0

Totalmente de acuerdo con @Tomalak. Si se trata de un sistema de producción, la respuesta correcta es eliminar cualquier carácter no numérico y validar el número resultante. –

Respuesta

7

Así pensaba para validarlo mediante una expresión regular, pero no sé si lo estoy haciendo correctamente.

De hecho, parece supercomplicado. Además, al hacer coincidir xxx-xxx-xxxx o xxx-xxxx donde x es un dígito se puede hacer mejor con "(\\d{3}-){1,2}\\d{4}". Para obtener más información sobre regex, recomiendo pasar por http://regular-expressions.info.

¿Qué tipo de excepción también tendré que lanzar? ¿Debo crear mi propia excepción?

A ValidatorException parece sencillo.

public static void isPhoneNumberValid(String phoneNumber) throws ValidatorException { 
    if (!phoneNumber.matches(regex)) { 
     throws ValidatorException("Invalid phone number"); 
    } 
} 

Si no desea crear uno usted mismo, por alguna razón, entonces probablemente me tomo IllegalArgumentException, pero aún así, no recomiendo eso.

Dicho esto, esta validación, por supuesto, no cubre los números de teléfono internacionales y/o externos. A menos que esto sea realmente una tarea, sugeriría reconsiderar la validación.

0

Puede combinar esos patrones con bastante facilidad, como lo sugiere BalusC.

Como nota al margen, StringTokenizer ha quedado obsoleto. De JavaDoc:

StringTokenizer es una clase de legado que se conserva por razones de compatibilidad, aunque se recomienda su uso en el nuevo código. Se recomienda que cualquiera que busque esta funcionalidad use el método de división de String o el paquete java.util.regex en su lugar.

Una forma más fácil de dividir su cadena en los segmentos apropiados serían:

String phoneParts[] = phoneNumber.split("-"); 
3
^(([(]?(\d{2,4})[)]?)|(\d{2,4})|([+1-9]+\d{1,2}))?[-\s]?(\d{2,3})?[-\s]?((\d{7,8})|(\d{3,4}[-\s]\d{3,4}))$ 

partidos (0060) 123-12345678, (0060) 12312345678, (832) 123- 1234567, (006) 03 a 12.345.678,

(006) 03-12345678, 00.603-12345678, 0060312345678

0000-123-12345678, 0000-12-12 345678, 0.000-1212345678 ... etc

1234-5678, 01-123-4567

se puede reemplazar '-' con ESPACIO es decir, (0080) 123 12345678

también coincide + 82-123 -1234567, +82 123 1234567, +800 01 12345678 ... etc.

Más información para el número de la vivienda privada/privada. No es para 1-800-000-0000 tipo de número

*Tested with Regex tester http://regexpal.com/

+0

Lea la pregunta en lugar de solo el título. Esto no es exactamente lo que el OP está pidiendo. * "Para estas asignaciones, el único formato válido son xxx-xxx-xxxx y xxx-xxxx, todos los demás formatos (xxx) xxx-xxxx o xxxxxxxxxx no son válidos en este caso." * – BalusC

+0

Como esta es la segunda vez que lo hace , Solo quiero informar que Stack Overflow es un sitio de Preguntas y respuestas. No es un foro de discusión donde todos los que buscan la respuesta exacta tienen que pasar por un lío de respuestas repetidas/sobregeneralizadas para encontrar la respuesta exacta que se busca. – BalusC

+3

Para su información, muchos desarrolladores están buscando respuestas "similares" pero no exactas. Solo trato de contribuir a la comunidad para que no tengan que navegar por otras redes para buscar lo que quieren. Al igual que mi caso, solo quiero tener una expresión completa de validación y esta página me inspiró. A pesar de no responder directamente, mi publicación al menos se ajusta al contexto. Es difícil buscar a alguien que haga la misma pregunta que desearía. – peterong

-3

cadena de código PIN = "589877";

Pattern pattern = Pattern.compile("\\d{6}"); 

\ d indica los dígitos. dentro de las llaves el número de dígitos Matcher matcher = pattern.matcher (código PIN);

if (matcher.matches()) { 
     System.out.println("Pincode is Valid"); 
     return true; 
    } else { 
     System.out.println("pincode must be a 6 digit Number"); 
+2

¿Has leído la pregunta? Esto no es lo que OP estaba preguntando. – Syon

Cuestiones relacionadas