Manipulación de Cadenas Introducción a los conceptos de clase e objetos Nadjet Bouayad-Agha Programación 2007-2008 Manipulación de Cadenas • Acceder a los carácteres de una cadena • Sustituir carácteres o (sub)cadenas por otro(a)s • Utilizar expresiones regulares y hacer “pattern matching” • Más linguistico: acceder a las palabras de una frase Manipulación de Cadenas • Acceder a los carácteres de una cadena • Sustituir carácteres o (sub)cadenas por otro(a)s • Utilizar expresiones regulares y hacer “pattern matching” = clase String • Más linguistico: acceder a las palabras de una frase = clase StringTokenizer Agenda de Hoy • Métodos de la clase String • Expresiones regulares • Métodos de la clase String para hacer “pattern matching” • Clase StringTokenizer • Un poco de teoría sobre clases y objetos Algunos métodos de la clase String String toUpperCase() String toLowerCase() int indexOf(int ch) String substring(int beginIndex) String replace(char oldChar,char newChar) boolean endsWith(String suffix) String[ ] split(String regex) boolean matches(String regex) String replaceFirst(String regex,String replacement) String replaceAll(String regex,String replacement) 5 Expresiones regulares • Patrones: http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Pattern.html#sum 6 Expresiones regulares • Pattern matching en la clase String: – boolean matches(String regex) – El método comprueba que la cadena concuerda totalemente con la expresión regular. – Un ejemplo: String cadena = “Hola”; if (cadena.matches(“Hola”)) System.out.println(“MATCH1”); if (cadena.matches(“Ho”)) System.out.println(“MATCH2”); if (cadena.matches(“Ho.*”)) System.out.println(“MATCH3”); 7 Expresiones regulares • Ejercicio - escribir expresiones regulares para representar los siguientes conceptos: – – – – Código secreto de una tarjeta de crédito. Una palabra que empieza con mayúscula. Un número. Una fecha de nacimiento. 8 Expresiones regulares • Como recuperar la subcadena concordante: – String replaceFirst(String regex,String replacement) – String replaceAll(String regex,String replacement) – Ponemos la(s) expresión(es) que queremos recuperar dentro de regex entre parentésis. – En replacement, podemos recuperar estas expresiones poniendo referencias atrás. 9 Expresiones regulares • Como recuperar la subcadena concordante: – Un ejemplo: cambiar una fecha del formato MM/DD/AA al formato DD/MM/AA. String fecha = “11/09/74”; String regex = “([0-9][0-9])/([0-9][0-9])/([0-9][0-9])”; if (fecha.matches(regex)) { fecha = fecha.replaceFirst(regex,”$2/$1/$3”); } – $1 corresponde a la primera pareja de parentésis en regex, $2 a la segunda, $3 a la tercera, etc. 10 La clase StringTokenizer • Dentro del paquete (package) java.util. Para importar este paquete scribir antes de la declaración de la clase: – import java.util.*; – import java.util.StringTokenizer; // para importar solo la clase que hay dentro de este paquete • Permite dividir una cadena en tokens • El delimitador por defecto es " \t\n\r\f" • El objeto de tipo StringTokenizer permite recorrer una vez la cadena por tokens. 11 La clase StringTokenizer • Ejemplo: import java.util.*; public class MyClass { public static void main(String[] args) { StringTokenizer st = new StringTokenizer("this is a test"); while (st.hasMoreTokens()) System.out.println(st.nextToken()); } } • Para dividir en tokens, con otros tipos de carácteres que los carácteres por defecto, podemos utilizar el constructor de objetos StringTokenizer con dos argumentos. Por ejemplo: StringTokenizer st = new StringTokenizer("Hola, qué tal, bien?",”,”); 12 Variables de tipo básico vs de objeto • Variable de tipo básico: int i=10; • Variable de objeto: StringTokenizer st = new StringTokenizer(“hola, qué tal”); i 10 st (datos) (métodos) 13 Variables de tipo básico vs de objeto • La variable st es una referencia a un objeto de tipo StringTokenizer, es decir un objeto de la clase StringTokenizer. • La variable i contiene el valor entero 10. • La variable st no contiene los tokens, sino la dirección en memoria del objeto responsable de la devolución de los tokens. • Una clase como StringTokenizer es como un molde que define las propiedades y el comportamiento (métodos) que constituyen cada objeto de esta clase. • Un objeto es una instancia de esta clase. 14 Manipulación de variables de objeto • La clase StringTokenizer tiene dos constructores: – StringTokenizer st = new StringTokenizer(“hola, qué tal?); – StringTokenizer st = new StringTokenizer(“hola, qué tal?”,”,”);. • Estos constructores construyen objetos de tipo (de la clase) String. • Para crear los objetos hemos utilizado con la instrucción new el nombre de la clase como un método. • Toda clase tiene al menos un constructor. 15 Manipulación de variables de objeto • Para inicializar una variable de objeto, utilizamos la referencia nula: StringTokenizer st = null; El valor null es la inicialización por defecto: String st; • Si llamamos a métodos con un objeto cuyo valor es null, entonces se produce un NullPointerException. 16 Manipulación de variables de objeto • Diferencia entre variables de objeto y variables de tipo básico: StringTokenizer st1 = new StringTokenizer(“hola qué tal?)”; StringTokenizer st2 = st1; int i = 10; Hemos copiado el int j = i; contenido 10 j i 10 de i dentro de j = el valor Hemos copiado el contenido de st1 dentro de st2 = la referencia (datos) st1 (métodos) st2 17 Manipulación de variables de objeto • st1 y st1 de la transparencia previa refieren al mismo objeto, tienen la misma referencia. En modo depuración en Netbeans, podemos verlo en la ventana de “Variables Locales”, así: • Si ahora imprimimos st1.nextToken() y después st2.nextToken(), se imprimirá primero hola y después en la siguiente línea qué 18 Manipulación de variables de objeto • Podemos comprobar la igualdad entre las dos variables de objeto: boolean igual = (st1 == st2); El boolean contiene “true”, pues las dos variables contienen la misma referencia. • Si por otro lado tenemos: StringTokenizer st1 = new StringTokenizer(“hola qué tal?); StringTokenizer st2 = new StringTokenizer(“hola qué tal?); boolean igual = (st1 == st2); El boolean contiene “false”, pues las variables contienen referencias distintas. • Un constructor en efecto devuelve la referencia (o dirección en memoria) del objeto. 19 Manipulación de variables de objeto • Accedemos a los datos de un objeto mediante métodos. • Llamamos a los métodos de un objeto a partir de su variable de objeto. Por ejemplo: – st.nextToken(); – cadena.length(); • Si la variable de objeto no apunta a un objeto, al llamar al método de este objeto, se produce un nullPointerException. 20 La clase String • String también es una clase. Pertenece al paquete java.lang, que es accesible desde cualquier programa (no hace falta importarlo). • String es una clase un poco especial. – Los objetos se pueden crear de dos formas equivalentes: String cadena = “hola”; String cadena = new String(“hola”); – Aparte de tener métodos, una variable de tipo String se comporta más bien como una variable de tipo básico: String cadena1 = “hola”; String cadena2 = cadena1; Los literales String siempre se copian. cadena1 y cadena2 no apuntan a la misma cadena. 21