Analizador que permita leer carácter, carácter o dígito, punto y coma

Es un analizador que solo pueda pasar del estado 0 al estado 1 con un cacacter (a,... Z), en el estado 1 hay un bucle donde puede leer carácter, dígito(0,.. 9) y que pase al estado 2 con un punto y coma (;). Hice este código pero cuando pongo que me valide una palabra sin punto y coma al final igual sale true y no debería, ¿cómo podría corregir eso?

package dtejemplo;
public class DTEjemplo {
public static boolean esCaracter(char c)
{
switch(c){
case 'a':
case 'A':
case 'b':
case 'B':
case 'c':
case 'd':
case 'D':
case 'e':
case 'E':
case 'f':
case 'F':
case 'g':
case 'G':
case 'h':
case 'H':
case 'i':
case 'I':
case 'j':
case 'J':
case 'que':
case 'QUE':
case 'l':
case 'L':
case 'm':
case 'M':
case 'n':
case 'N':
case 'ñ':
case 'Ñ':
case 'o':
case 'O':
case 'p':
case 'P':
case 'que':
case 'QUE':
case 'r':
case 'R':
case 'es':
case 'S':
case 't':
case 'T':
case 'u':
case 'U':
case 'v':
case 'V':
case 'w':
case 'W':
case 'x':
case 'X':
case 'y':
case 'Y':
case 'z':
case 'Z':
return true;
default:
return false;
}
}
public static boolean esDigito(char c)
{
switch(c){
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
return true;
default:
return false;
}
}
public static boolean validar(String str) {
//boolean admitio=false;
int estado = 0;
for (int i = 0; i < str.length() ; i++)
{ char c = str.charAt(i);
switch (estado) {
case 0:
if (esCaracter(c) )
estado = 1;
else
return false;
break;
case 1:
if (esCaracter(c))
estado = 1;
else if (esDigito(c))
estado = 1;
else if (c == ';')
estado = 2;
else
return false;
break;
default:
return false;
}
}
return true;
}
public static void main(String[] args) {
System.out.println(DTEjemplo.validar("abgz1")); //me permite sin punto y coma!!
}
}

1 respuesta

Respuesta
1

A ver, en primer lugar, si no lo he entendido mal, quieres comprobar que el String a validar tiene que empezar con letra, seguido de una serie de letras o números(sin importar cuantos hayan) y terminar con ';'.

Si esto es realmente lo que necesitas hacer, hay un modo mucho mas simple y con menos posibilidad de errores que el que estas haciendo, que es haciendo uso de las expresiones regulares.(http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular)

Si usaras expresiones regulares el código te quedaría de esta forma:

public static boolean validar(String str) {
     return str.matches("^[a-zA-Z]+[a-zA-Z0-9]*;$");
}

Si no has trabajado nunca con expresiones regulares puede ser un poco duro de entender, tómatelo con calma.

Si igualmente, quieres saber donde esta el fallo en tu código, el problema lo tienes en el ultimo swicht, ya que tratas al punto y coma como otro carácter mas de esa fase.

public static boolean validar(String str) {
 int estado = 0;
 for (int i = 0; i < str.length(); i++) {
 char c = str.charAt(i);
 switch (estado) {
 case 0:
 if (esCaracter(c)) {
 estado = 1;
 } else {
 return false;
 }
 break;
 case 1:
 if (esCaracter(c)) {
 estado = 1;
 } else if (esDigito(c)) {
 estado = 1;
 } else if (c == ';') {
 return true;
 } else {
 return false;
 }
 break;
 default:
 return false;
 }
 }
 return false;
 }

fijate como te lo he puesto ahora, la única forma de salir con un true es mediante el if de c == ';' ya que eso tiene que marcar, según tus indicaciones, el final, si no se entra nunca en ese if, significa que no se ha llegado nunca a un ;.

este código, igualmente permite una entrada como esta:

a2342ff234;as

Vamos, caracteres después del ; si esto también lo quieres evitar, podrías hacerlo del siguiente modo:

public static boolean validar(String str) {
//boolean admitio=false;
 int estado = 0;
 for (int i = 0; i < str.length(); i++) {
 char c = str.charAt(i);
 switch (estado) {
 case 0:
 if (esCaracter(c)) {
 estado = 1;
 } else {
 return false;
 }
 break;
 case 1:
 if (esCaracter(c)) {
 estado = 1;
 } else if (esDigito(c)) {
 estado = 1;
 } else if (c == ';') {
 if (i + 1 == str.length()) {
 return true;
 } else {
 return false;
 }
 } else {
 return false;
 }
 break;
 default:
 return false;
}
}
 return false;
}

He añadido una comprobación que lo que hace es que, cuando llegamos al punto y coma, miramos si estamos en la ultima intentar del string, de no ser así, pues devolvemos false.

En fin, espero ser de ayuda y te recomiendo mucho que te mires expresiones regulares, porque como has visto, conviertes un código de MUCHAS lineas como tenias y varios métodos, en una simple linea de código.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas