Saltar navegación

2025-02-03-Programacion - Contenido educativo

Ajuste de pantalla

El ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:

Subido el 3 de febrero de 2025 por Jose Manuel M.

23 visualizaciones

Tema 6 - Resolviendo dudas. Expresiones regulares

Descargar la transcripción

Bueno, y repito un segundillo, estaba comentando fuera de grabación que el día del examen, el día 12, os citaremos quizás un pelín antes para poder disponer de todo el tiempo del examen escribiendo ya en él. 00:00:00
Entonces, pues como 10-15 minutos antes, quien por tema de trabajo llegue apurado a la hora justa de iniciar el examen, pues no pasa nada, se incorpora en ese momento. 00:00:14
Y el examen lo tenemos el día 12, entonces la semana que viene, como la tenéis con exámenes, no sé si ya el día 10 tenéis alguno, no recuerdo muy bien el calendario, pero sea como fuere, toda esta semana han suspendido las tutorías. 00:00:22
Con lo cual la semana que viene, el 10, no nos vemos. Si tenéis alguna consulta que me queráis hacer respecto a lo que es el temario o respecto al examen o lo que sea, pues me lo podéis hacer por los foros, pero ya hasta el día del examen, una vez acabemos la tutoría y no nos volvemos a ver o no volvemos a hablar así en tutoría. 00:00:37
y nada, pues esto, comentaros esto 00:00:58
por otro lado, bueno, pues nada, vamos a abrir un poco 00:01:02
para ponernos a trabajar ya hoy en la tutoría, no sé si tenéis alguna consulta 00:01:07
que queréis hacerme en particular, el examen justo hasta los contenidos 00:01:11
que hemos visto en el tema 6 y no sé si tenéis 00:01:15
alguna consulta que me queréis hacer 00:01:19
antes de arrancar a hablar de diferentes cosas 00:01:20
Sí, sí. Había pensado justo arrancar comentando estas dos cositas. Estos dos debates que se han abierto ahora en el foro. 00:01:25
Entonces, si te parece, ahora abrimos Eclipse y nos ponemos a trabajar un poco sobre ello. Y si sobre la marcha sigue habiendo dudas, pues me preguntas y vemos cómo las aclaramos. 00:02:10
bueno pues venga pues mira vamos a arrancar si van surgiendo cosas nuevas me va a ir diciendo 00:02:20
y si no vamos a arrancar justo a hacer cosas aquí con Eclipse ya voy a crear un nuevo proyecto 00:02:29
digamos es reg de expresiones regulares por si luego una vez aclaremos esta un poquillo estar 00:02:37
dos dudas que teníamos seguimos con expresiones regulares y si no bueno pues da igual el nombre 00:02:44
el proyecto para trabajar cualquier cosa. Vamos a crear el proyecto. 00:02:51
Creamos una clase por aquí. Podemos llamar es Reg también. 00:02:55
Bueno, aquí vamos a meter el 00:03:05
main de inicio del programa. Y bueno, hemos tenido 00:03:10
este fin de semana un par de dudas 00:03:21
abiertas, un par de debates ahí en el foro. Uno de ellas tenía que ver 00:03:26
con, bueno, pues sabemos que tenemos los arrays que nos sirven para 00:03:30
definir variables, un conjunto de variables 00:03:34
del mismo tipo. Vamos a crear aquí dentro del proyecto 00:03:36
una clase persona, un momento 00:03:39
para ir apoyándonos en ella también en las explicaciones 00:03:43
sin tampoco mucho detalle 00:03:46
de métodos y atributos, vamos a ponerle 00:03:50
que tenga un nombre, por ejemplo, de momento, si luego necesitamos 00:03:53
más cosas ya la vamos haciendo. Cuando nosotros definimos 00:03:56
una variable primitiva, pues decimos 00:04:00
int i y decimos que la variable primitiva 00:04:03
directamente hacen ya una reserva de memoria RAM para trabajar con ellas. 00:04:07
Si nosotros ponemos aquí otro int i, pues como en este ámbito está definida ya una variable que se llama i 00:04:11
y tenemos aquí otra, pues básicamente, bueno, directamente no nos deja, no hay que hacer muchas más suposiciones, 00:04:20
no permite que dos variables se llamen de la misma forma, pero un poquito por buscar una lógica, 00:04:26
Si dijésemos que i vale 3 y tuviésemos dos variables, dos espacios de memoria que se han reservado para una variable que se llama i, pues no sabría qué espacio de memoria reservarlo. Imaginaros que esta, al ser primitiva, no ha sido necesario un new, pero el sistema operativo le ha dado a la máquina virtual de Java, a la ejecución del programa, la posición 20.000 para guardar en un tamaño de un entero un valor. 00:04:31
y en esta la 30.000. Pues si decimos aquí int i igual a 3, pues diría 00:04:55
¿dónde lo guardo? ¿En la 20.000 o en la 30.000? Una discrepancia, ambigüedad 00:04:59
no me gusta. Si aquí en lugar de 00:05:03
considerar dos variables int i 00:05:07
dijésemos que una es un float y la llamásemos 00:05:11
i, pues seguiría pasándonos lo mismo. En este caso 00:05:15
se nos intentaría hacer una reserva para el tamaño de un float 00:05:19
pero nos reservaría 00:05:22
una posición diferente, vamos a suponer la 40.000 00:05:27
si decimos i igual a 3 00:05:29
pues diría, ¿dónde lo guardo? 00:05:32
para el entero o para el float, en la posición 20.000 o en la 40.000 00:05:34
este i, ¿a qué estará refiriéndose? 00:05:38
pues nada, directamente no me compila en la segunda vez 00:05:41
que lo intento, y si yo cojo 00:05:44
y en lugar de una variable primitiva digo 00:05:47
Persona i, pues vuelvo a estar en las mismas, coge y dice aquí estás definiendo un puntero, un dedito que intenta señalar a una persona y me has dicho que se llama i. 00:05:50
como hay una duplicidad de nombre de variables, pues ya no me gusta 00:06:07
entonces, si aquí cogemos y definimos 00:06:11
un array de personas, de enteros 00:06:16
por ejemplo, o de personas, persona, mi per 00:06:19
vamos a ir con los 00:06:23
se mezclan un poquito las dos cuestiones que se han abierto, pero vamos 00:06:30
a ir hablando un poquito de esto, fijaros, si yo pongo 00:06:35
persona miper, esto lo que hará será hacer una reserva de memoria RAM para miper, vamos a suponer 00:06:39
la 40.000 y ¿para qué estará reservando espacio en memoria en la 40.000? Pues estará reservando 00:06:49
espacio para algo que terminará apuntando a un conjunto de referencias a personas. Vamos a suponer 00:06:55
que mi per apunta a la posición 00:07:05
que deciros. Bueno, 40.000 hemos dicho 00:07:08
aquí. O sea, la 40.000. Si yo ahora cojo 00:07:13
y digo mi per igual a new 00:07:23
persona, pongo aquí 5, lo que estoy 00:07:27
haciendo es que a partir del 40.000 tengo 5 referencias 00:07:39
a personas. No 5 personas, 5 referencias a personas. 00:07:44
igual la primera referencia a una persona está en la posición 0 00:07:47
y precisamente utiliza la posición 40.000, a lo mejor, ¿vale? 00:07:54
Para la posición 1 apunta a la 40.050, por ejemplo. 00:08:06
Vamos a poner aquí 3 para no escribir tanto. 00:08:12
Y a lo mejor la posición 40.002 apunta a la posición 100. 00:08:19
no quiere decir que entre este 00:08:24
40.000 y 40.050 00:08:27
esté 00:08:29
el nombre que tiene una persona 00:08:30
no, esto es, será 00:08:33
bueno, de hecho 00:08:34
de forma inicial 00:08:37
sería null 00:08:39
posiblemente, no apuntarían a ninguna persona 00:08:40
estos son, digamos 00:08:43
punteros donde puede haber 00:08:44
personas 00:08:46
y luego si yo pongo aquí mi per 00:08:47
0, igual 00:08:50
esto en realidad empezaría apuntando a null, a ninguna persona en particular 00:08:54
y cuando cojo y hago mi per new 00:09:06
persona, aquí lo que haría el sistema operativo sería reservar espacio 00:09:17
de memoria para una determinada persona, para una persona 00:09:24
fijaros, esto es una persona en su conjunto 00:09:28
los arrays se pueden poner los asteriscos aquí o aquí 00:09:30
entonces fijaros, esto, si marcamos todo esto 00:09:35
y leemos hacia la izquierda, esto es un array de personas 00:09:39
y esto es una persona. 00:09:43
Fijaros, hacia la izquierda me ha quedado persona solo. 00:09:46
Entonces, si hacemos un new a esto, 00:09:48
esto sí que me haría una reserva de memoria. 00:09:50
Por ejemplo, en el 50.000 00:09:52
y a partir de esta posición de memoria 00:09:54
es donde podríamos poner el nombre de esta persona. 00:10:00
A ver si lo explico. 00:10:07
Un array, esto, sin hacer un new al array, 00:10:10
es algo que va a terminar apuntando. 00:10:14
imaginaos que es un puntero, con un dedito que señalamos algo, es algo 00:10:16
que va a estar apuntando a una raíz de personas, pero no lo hemos hecho 00:10:21
el new, para dimensionarlo, pues será algo que apuntará 00:10:24
a una raíz de personas, cuando hacemos el new, lo que hacemos es 00:10:29
definir, en este caso, tres variables 00:10:32
de persona, pero no hemos hecho la reserva para su espacio de memoria, es como si pusiéramos aquí 00:10:36
persona, miper, pero no le hiciéramos el new 00:10:42
miper2 y no le hiciéramos el new. Esto como no hemos hecho el new 00:10:47
no tenemos espacio donde guardarle el nombre de esta persona 00:10:51
miper2 pero en cambio tenemos un dedito que va a ser capaz 00:10:55
de apuntar a un sitio donde finalmente va a haber una persona 00:10:59
y cuando pongo miper2 igual a new 00:11:02
persona estoy haciendo una reserva 00:11:06
para un objeto de la clase persona que por ejemplo sea la posición 00:11:11
60.000 y este punterito que antes todavía no habíamos asignado un valor y probablemente 00:11:15
directamente valía nul empieza a valer 60.000 que es el punto donde va a empezar datos para 00:11:23
una persona para la cual sí que hemos reservado espacio de memoria si me dicen por aquí que 00:11:29
quieren participar a ver dime si no no no no no no no no no no no no no no la misma persona 00:11:39
aquí hay un grupo de personas mira aquí estamos definiendo una variable pues si yo cojo y pongo 00:12:24
int aquí no tienes un entero aquí lo que tiene son 10 enteros esto es un entero estos son 10 enteros 00:12:33
esto voy a juntar las dos esto es una persona estos son punteros a tres personas para que sea 00:12:52
equivalente este a este, si quitamos el new, 00:13:14
esto es un puntero a una sola persona, igual que esto 00:13:20
es una variable de un entero, esto son 00:13:23
tres punteros a tres personas distintas, a José, Ana, 00:13:27
Laura, igual que esto son diez variables enteras, diferentes 00:13:31
cada una. Lo que pasa es que cuando trabajamos con un array, lo que compartimos 00:13:35
es un nombre, digamos que pudiéramos para estas 00:13:40
10 personas, hacer un grupo. 00:13:43
Entonces, y a 00:13:46
todas esas 10 personas las llamamos 00:13:48
con un nombre en común. Pues este sería el nombre en común 00:13:49
de esas 10 personas, pero esto 00:13:52
no sería una persona con 3 atributos. 00:13:53
Serían 3 personas 00:13:56
y cada persona, cada una de esas 3 personas 00:13:57
tendrán todos estos atributos. 00:13:59
Los que estén definidos en la clase persona. 00:14:02
No, no, pero... 00:14:10
Sí. 00:14:13
Dices... Me he quedado antes 00:14:56
con lo que ha dicho. Afectos prácticos 00:14:58
miper trabajas como un grupo de personas, pero no es que sea 00:15:00
a efectos prácticos, o sea, que a efectos prácticos lógicamente 00:15:04
trabajas así, es que es lo que es, un grupo de personas 00:15:07
o sea, en ningún momento miper aquí es una persona 00:15:10
es un array, un conjunto de personas 00:15:13
bueno, es que 00:15:16
perdona, un momentito, por si a lo mejor 00:15:27
los matices, bueno, perdona por decir tu nombre que estamos con la grabación 00:15:31
sí, sí, que 00:15:35
es que mi per no es un objeto, mi per, mira, tú lee de aquí 00:15:37
para ver lo que es mi per, vamos a leer hacia la izquierda, mi per es 00:15:43
un array de personas, un array 00:15:46
de objetos, mi per no es un objeto, es un array de objetos 00:15:50
y un determinado valor de mi per 00:15:54
o sea, si ponemos aquí mi per 0 00:15:58
fíjate, considerando los corchetes 00:16:02
leemos lo que aquí leemos de izquierda a derecha, vamos a leerlo 00:16:06
aquí de derecha a izquierda, miper con el array, esto 00:16:10
si es un objeto de una persona. Bueno, un objeto cuando 00:16:13
le hagamos el new, de momento es una referencia a una persona. 00:16:16
Pero miper no es un objeto de una persona, miper es 00:16:19
un array de personas, un conjunto de personas. 00:16:22
De hecho, tú no puedes poner, 00:16:26
mira, si fuera una persona, miper, 00:16:28
lo pudiéramos considerar esto como una persona, nos aceptaría 00:16:31
aquí el id, poner mi per punto, porque si es una persona, llegar a los 00:16:34
atributos de una persona. Nos permitiría poner mi per punto 00:16:38
ese nombre, pero esto no existe. ¿Por qué? Porque 00:16:42
un array de personas no es una 00:16:45
persona. En cambio, si cogemos y decimos mi per 00:16:50
mira, añado los corchetes, que si hacemos la lectura de aquí 00:16:53
derecha e izquierda, fíjate como a la izquierda ya se me queda que esto es una persona 00:16:58
y pongo punto, ese nombre 00:17:02
sí que está. ¿Por qué? Porque mi per 00:17:04
entre corchetes con un índice 00:17:06
eso sí que es una persona en particular. 00:17:08
Eso es. Bueno, 00:17:16
sí, eso es. Un grupo de personas 00:17:18
con un matiz 00:17:19
que es lo otro que os he intentado 00:17:21
contar, no sé si mejor o peor 00:17:24
en el foro. 00:17:26
Lo que estás creando 00:17:28
aquí es un grupo 00:17:30
nos olvidamos de esto por un 00:17:32
momento, estás creando un grupo 00:17:34
de referencias 00:17:36
de deditos que apuntan 00:17:37
a personas. Para 00:17:40
llevárnoslo a un caso simple, si pones aquí mi 00:17:41
per persona 00:17:43
y pones punto y coma y no 00:17:47
haces el new, ¿p qué es? 00:17:49
p va a ser algo 00:17:52
que va a terminar apuntando en memoria RAM 00:17:53
a donde vaya a existir en un futuro una persona 00:17:55
pero como no hemos hecho el new, no lo hemos 00:17:57
pedido al sistema operativo espacio 00:17:59
para esa persona. Entonces esto inicialmente 00:18:01
es como que no apunta a ningún sitio 00:18:04
todavía. 00:18:06
Cuando yo haga p igual a new persona, ponga el new y llame al constructor, en ese momento, que normalmente está ahí esta línea, la ponemos en una solo, en este momento es cuando hacemos reserva en memoria RAM. 00:18:07
Imagínate que nos dice la posición 60.000, este empieza ya a apuntar a la posición 60.000 y terminamos llamando a un constructor para que haga las inicializaciones que tengamos programadas. 00:18:25
pues esto que todavía no es una persona que apunta null 00:18:34
es un dedito que terminará apuntando una persona cuando tengamos espacio de memoria 00:18:39
después de hacer el new, pues lo que estamos haciendo aquí es 00:18:43
con esta instrucción, lo que estamos haciendo con esta 00:18:47
expresión es crear, igual que aquí creamos 00:19:01
con este new, creamos una persona a la cual 00:19:05
apuntar algo que hasta este momento era 00:19:09
era un dedito, aquí lo que estamos creando son tres deditos 00:19:13
que apuntarán a tres personas, pero los tres apuntan 00:19:18
a nulo. En este momento, mi per 00:19:26
y entre corchetes cero es como si hubiéramos hecho esto con una variable normal. 00:19:30
Mi per entre corchetes uno es como si hubiéramos hecho esto con una variable 00:19:34
normal y mi per dos igualmente. Son tres 00:19:38
punteros, pero para ninguna de esas tres personas hemos hecho una reserva de memoria. 00:19:42
Hemos hecho aquí para un grupo de tres personas el equivalente a esto para una sola variable. 00:19:46
Por eso, cuando haces un array, como no tienes reservado espacio, fíjate que aquí no hemos llamado a ningún constructor de la clase persona, por mucho que aparezca aquí un new. 00:19:53
¿Ves? El constructor va entre paréntesis y aquí lo que hemos hecho ha sido entre corchetes dimensionar el array. 00:20:03
Es igual que aquí, hemos dimensionado la raíz con 10 enteros, hemos tenido que hacer los new para j0, j1, j2, no, ¿por qué? Porque estas son variables primitivas y para las variables primitivas no es necesario hacer el new, por eso aquí no hacemos el new para cada uno de los enteros, pero de la misma forma que aquí, para algo que es una variable referenciada, si tenemos que hacer su new, identificamos el punterito que la va a señalar y luego hacemos el new llamando al constructor, 00:20:09
aquí, lo que hemos hecho ha sido un grupito 00:20:37
de 10, en este caso de 3, porque hemos dado 00:20:40
dimensión de 3, de 3 punteros que van a apuntar 00:20:43
a 3 personas distintas, el equivalente a esto 00:20:46
¿cuándo lo tendremos que hacer? Pues si queremos 00:20:49
para cada una de estas 3 personas sabemos que vamos a poder acceder 00:20:51
a ellas a través de un nombre común 00:20:55
la primera con el índice 0 00:20:57
esto es un dedito que apunta a una persona igual que lo es 00:21:00
fíjate como si leemos de izquierda a derecha y nos venimos a la definición 00:21:04
de derecha a izquierda, eso ya es un punterito 00:21:09
de una persona, entonces si hacemos aquí el new persona 00:21:12
y ahora aquí sí que fíjate ponemos constructor, esto 00:21:16
es esto, estamos reservando 00:21:20
espacio de memoria para esta persona, igual que aquí 00:21:25
lo hicimos para esta, hasta que no hemos hecho el new 00:21:28
con el constructor de la clase persona, 00:21:31
no hemos tenido espacio para poder trabajar con esa persona. 00:21:36
Aquí, para la referencia p con una variable normal, 00:21:39
aquí, para la referencia mi per cero, 00:21:42
acordándonos que es una referencia a una persona. 00:21:46
Este es el momento en el que ya tenemos para esta persona 00:21:48
espacio de memoria reservada. 00:21:51
Mira. 00:21:53
Sí, dime. 00:21:56
Ah, ajá. 00:21:59
Claro, es que, claro, claro, ¿qué es lo que sucede? Mira, digamos que retomando cosas que hemos hablado en otros momentos y dejando un momentito los arrays a un lado, aunque luego terminemos en ellos, ¿qué hacíamos cuando definíamos una variable de tipo entero? 00:22:15
Pues esta es una variable de tipo, una variable primitiva y para variables primitivas no es necesario hacer new, ¿verdad? 00:23:04
Cogíamos y decíamos persona, mi per 30 vamos a poner aquí, new persona. 00:23:13
Para una variable que es referenciada, pues una variable de un objeto de una clase que hemos desarrollado nosotros en nuestro programa 00:23:23
o que hemos incorporado desde las librerías, sí que necesitamos nosotros 00:23:31
hacer el new obligatorio. Y luego había un caso intermedio, que son 00:23:35
los strings, acordaros. Los strings son variables 00:23:39
referenciadas, pero que tienen características, algunas de las características 00:23:42
de las primitivas. En sí, si hay que decir que sí son una 00:23:47
cosa u otra, son referenciadas, es cierto. De hecho, si tú defines un 00:23:51
string, pues te permite incluso hacerle un new y 00:23:55
compila, ¿ves? Y te permite 00:24:05
también trabajar con ella sin hacerle 00:24:07
el new, porque está un poco a medio 00:24:09
camino entre las primitivas, 00:24:11
como los enteros, y las referenciadas. 00:24:13
Entonces, con tu array 00:24:16
de strings, ¿qué es lo que ha pasado? 00:24:17
Lo que ha pasado es que, igual 00:24:19
que si haces un array de enteros, 00:24:21
te funciona 00:24:24
directamente sin hacer new, porque 00:24:25
cada una de todas 00:24:27
las referencias de este 00:24:29
entero de jotas, no es 00:24:31
necesario hacerle, bueno, 00:24:33
Sí que le tienes que dimensionar con esto, pero fíjate que no estamos llamando a un constructor de enteros. 00:24:35
Lo que estamos dando es un tamaño, igual que le estamos dando un tamaño aquí, a los punteros referenciador de persona. 00:24:40
Pero no hacemos un new para cada uno de los enteros. ¿Por qué? Porque para las variables ya no lo necesitamos. 00:24:47
Esto es un conjunto de tres enteros y como los enteros son primitivos, para cada entero no es necesario hacer un j0 igual a new int. 00:24:52
Esto, de hecho, ni nos deja. 00:25:08
¿Por qué? Porque es primitiva y lo hace él solo. 00:25:10
Para los strings, como están a medio camino entre las referenciadas y las primitivas, 00:25:13
acuérdate que no es necesario hacerle un new. 00:25:18
Entonces, como no es necesario hacerle un new, 00:25:20
si tú coges y pones aquí string b igual a new string 2, por ejemplo, 00:25:22
pues esto serían dos referencias a personas, 00:25:33
pero para esas dos referencias, igual que para una variable normal de string no es necesario hacerle un new, pues para esas dos referencias, que son en total dos strings que comparten el cierto nombre aquí, en cuanto a nombre de grupo, no es necesario hacerle el string. 00:25:37
Por eso, con el string te funciona, porque el new lo hace directamente la máquina virtual de Java cuando se pone a ejecutar. 00:25:52
Pero, para un objeto de la clase persona, que es un referenciado puro y sí que necesitamos el new, 00:25:59
obligatoriamente tienes que hacer un new para cada uno de todos los objetos con los que trabajes. 00:26:04
Bueno, es que, a ver, seguramente tú consigues un programa que te dé el resultado a través de strings. 00:26:45
Pero en realidad tenemos que buscar hacer el enfoque del ejercicio a nivel funcional y luego trasladarlo al programa. Entonces, ¿tú en verdad qué es lo que tienes? ¿Tienes en tu programa general, en tu main, tienes un array de nombres de frigoríficos o de nombres de personas? 00:26:55
No, tú lo que tienes es un grupo de personas. 00:27:20
Tú imagínate que estuviéramos haciendo un ejercicio para aquí, para clase, ¿no? 00:27:23
Entonces, ¿cómo organizarías tú esto? 00:27:28
Un poco olvidándonos de que vamos a programarlo en Java, pues dirías, 00:27:30
pues mira, en el aula yo tengo un conjunto de personas. 00:27:35
Ese conjunto de personas, ¿qué es lo que tienen? 00:27:39
Tienen un nombre y un número de matrícula. 00:27:41
¿El nombre de cada una de las personas a ti te parece que es coherente definirlo en el conjunto del aula o el nombre lo identificamos en cada una de las personas? 00:27:43
El nombre es de cada una de las personas, no es del aula. El nombre de las personas no es del aula, el nombre de las personas es de las personas. 00:27:58
Lo que hay es una serie de personas, alumnos, que eso sí que pueden pertenecer a un determinado aula. No sé si me explico. 00:28:05
O sea, por diseño. Está claro que si tú estabas teniendo el problema este de hacer el new para las personas o para las cocinas o para los frigoríficos, para los frigoríficos en este caso, como estamos ahí a medio caballo entre dos aplicaciones. 00:28:11
bueno, como estabas teniendo ese problema y no eras capaz 00:28:26
de resolverlo, pues me parece 00:28:29
que practicando, pues me parece 00:28:31
bien que hagas el intento de decir 00:28:33
pues mira, el color de la placa o el color 00:28:34
de frigorífico, la marca, bueno, como 00:28:37
venga a ser, pues me lo llevo a una 00:28:38
instancia más mayor, pero 00:28:41
la marca de una placa 00:28:42
pertenece a una placa, no 00:28:44
pertenece a la cocina 00:28:46
la cocina tiene las placas 00:28:48
y las placas tienen su marca 00:28:50
¿sabes? 00:28:52
entonces 00:28:54
Claro, es lo que otras veces, por ejemplo, os he intentado también contar. Imagínate que tienes aquí, en la clase persona, organizar las cosas, luego las llevamos en programa Java, bien, pero vamos a intentar darle una lógica de razonarlo como humanos, digamos, ¿vale? 00:28:56
tú tienes un aula donde hay personas, las personas tienen unas características 00:29:17
y hacen una serie de cosas que son sus métodos, igual que está eso pues habrá 00:29:21
un proyector, el proyector tendrá sus características y tendrá sus métodos 00:29:25
entonces yo digo en el aula hay alumnos, defino alumnos 00:29:29
en el aula hay un profesor, defino un profesor, en el aula hay un proyector, defino un proyector 00:29:34
todos esos elementos pertenecen al aula, sí 00:29:38
el proyector, los alumnos y el profesor, ahora el nombre de un 00:29:41
alumno pertenece al aula para definirlo en una instancia mayor que es el aula? Pues no, el nombre 00:29:45
del alumno pertenece a cada alumno. Entonces, si hemos definido un objeto alumno dentro de los 00:29:52
alumnos, vamos a identificar esos alumnos. Mira, otra cosa que ayuda además a, que es simplemente 00:29:56
un poco por pura lógica, pero otra cosa que ayuda además a pensar que esto es lo correcto, pues tú 00:30:03
piensa que estás haciendo un programa en el cual participa una persona que tiene un nombre y luego 00:30:10
de repente dices, pues mira, esta clase de persona 00:30:15
que la he probado en este proyecto me parece 00:30:17
muy interesante cómo está trabajado 00:30:19
y resulta que tengo que hacer otro proyecto 00:30:21
este era de, yo qué sé qué decirte, de un 00:30:23
campo de fútbol y ahora vas a hacer uno de tiendas 00:30:25
pero dices, justo la 00:30:27
definición de la clase de persona me viene muy 00:30:29
bien para la clase de tiendas 00:30:31
entonces si tú te vas a llevar 00:30:33
todas las características 00:30:34
de esa clase de persona de un proyecto a otro 00:30:37
pues que te llevan la clase de persona 00:30:39
que es la que está recogiendo las características 00:30:41
y las acciones que hacen las personas 00:30:43
Si lo haces de la otra forma y los nombres de las personas te las has llevado a la clase en sí, aula, pues si te llevas la clase personal se va a esa persona sin nombre. 00:30:44
Sí, no sé. Sí, sí, bueno. Mira, dentro de la clase persona vamos a poner, por ejemplo, un poquito insistiendo en que por diseño, aunque es verdad que Java va a ser capaz de tragarse ejecuciones que sean diferentes, pero bueno, para insistir un poco más en cosas que os digo a veces. 00:30:55
imaginaros que tienes aquí un método que es public void saludar y yo conjo y tengo aquí un 00:31:26
system punto out punto println y pongo aquí hola más imagínate que tengo aquí una variable ese 00:31:38
saludo 2 entonces está ahora mismo no me compila porque esta variable no existe esta variable para 00:31:52
que me compile, yo puedo definirla aquí, ya me compila, o puedo 00:32:05
definirla aquí, en el ámbito local de esta clase, o la puedo 00:32:11
definir como una variable de clase. ¿Dónde está más correcto 00:32:20
definir esta variable? ¿Saludo2 es un atributo que caracterice 00:32:24
a las personas o es una variable que parece que necesitamos 00:32:30
de forma local para construir nuestro programa Java dentro 00:32:34
el método saludar. Pues a mí me pega más que pertenece a esto, ¿no? 00:32:37
Pues entonces, esta variable, donde hay que definirla, es aquí, porque aquí 00:32:41
puedo tener otro método, que sea el método despedir, 00:32:45
donde no tiene ningún sentido que exista una variable 00:32:56
que sea saludo2. Esta variable es para un uso particular 00:32:59
en un momento dado dentro del método saludar. Imagínate que aquí cogiésemos 00:33:03
a través de un escáner el saludo que en verdad se va a sacar por 00:33:08
pantalla. Esto no es una característica de las personas. 00:33:11
Si tú pones esto aquí, el programa Java te compila 00:33:16
un poquito algo parecido a lo que has necesitado hacer tú para resolver este 00:33:19
problema que tenías. Pero aquí, por diseño, ¿está bien 00:33:23
definida esta variable? No. Esta variable está bien definida aquí. Igual que el nombre, pues si 00:33:27
parece correcto que esté aquí, porque sí que es algo que caracteriza a las personas. 00:33:31
¿Sí? Bueno. Vale. Genial. Nada, nada. 00:33:40
Y luego, bueno, acabo con esto de los array que os estaba contando para justificar que tenemos que hacer un new a cada uno de ellos. 00:33:43
fijaros, aquí para comprobar de verdad 00:33:58
que lo que hemos hecho ha sido en esta definición del array 00:34:03
que fijaros, insisto, algo que nos puede mostrar que en verdad no hemos hecho reserva 00:34:07
para el espacio de memoria RAM de las diferentes personas 00:34:11
fijaros que aquí hay corchetes, en realidad no hay 00:34:14
el constructor, no estamos llamados al constructor que es el que acompañamos a new cuando creamos 00:34:17
espacio de memoria RAM para una determinada persona, aquí lo que estamos 00:34:23
es con el new dimensionando el array, que es un array en este caso de punteros 00:34:26
a personas. Entonces fijaros aquí 00:34:31
para la persona 0 justo, una de las tres que se definen, al tener 00:34:36
tamaño 3, estará mi per 0, mi per 1 y mi per 2 00:34:40
para este sí que estamos haciendo una reserva de memoria RAM para esa persona en particular 00:34:43
Entonces fijaros, si yo hago aquí un system.out.println 00:34:48
de mi per 0, ese nombre 00:34:52
es previsible que este no falle 00:34:55
y es previsible que este falle. ¿Por qué? 00:35:02
Porque para mi per 0 he hecho una reserva de memoria 00:35:07
para esa persona aquí y para mi per 1 no la he hecho. Es verdad que existe esa 00:35:10
referencia dada de alta en el array, pero no he hecho 00:35:15
un new para esa persona en particular. Entonces fijaros 00:35:19
como si ejecutamos esto, ¿veis? El programa 00:35:23
me ha sacado un posición 0, dos puntos, es decir, ha ejecutado 00:35:27
esta instrucción, me ha dicho que es null porque 00:35:35
a esta variable no le hemos dado ningún valor, vamos a darle aquí un valor al constructor 00:35:44
en el constructor, por ejemplo, vamos a decir 00:35:49
public persona, vamos a hacer que todas las personas 00:35:52
inicialmente tengan en este string algo que ponga sin nombre 00:36:04
cuando llegamos al constructor damos al ese nombre 00:36:08
un sin nombre para todo objeto que llame este constructor, que será lo que estará 00:36:17
pasando aquí, entonces si hacemos esa ejecución 00:36:23
fijaros como esta primera línea si funciona 00:36:25
es capaz de mostrarme el nombre que es sin nombre porque no se lo hemos asignado 00:36:29
tiene este valor porque se lo ha asignado aquí en el constructor 00:36:35
pero cuando intentamos hacer este otro acceso 00:36:38
en este en particular me pega un error, dice 00:36:42
no puedo leer ese nombre porque 00:36:47
mi per 1 es 00:36:49
null. ¿Y por qué es null? Pues porque 00:36:52
no le hemos hecho un new. 00:36:54
¿Existe algo que apunta 00:36:58
mi per 1 a lo que 00:37:00
futuro será una persona? Sí, porque esto es 00:37:02
un conjunto de 00:37:04
punteros a personas. 00:37:06
¿Pero existe la persona esa 00:37:09
en particular? No, porque no le hemos hecho el new 00:37:10
para ese puntero. Entonces, si yo 00:37:12
cojo y pongo mi per 1 00:37:14
new persona, 00:37:16
ahora ya, 00:37:18
Me funcionan los dos porque le he hecho el new. 00:37:19
Y mirad, para insistir un poquillo más en lo que son esto de los punteros y lo que no son los punteros, 00:37:26
fijaros, podemos coger y hacer miper.eseNombre, vamos a decirle, vamos a darle un valor. 00:37:39
Vamos a decirle que se llame no. 00:37:48
Aquí lo tenemos completo, bien. 00:37:51
Si yo ahora cojo y digo persona miper2, punto y coma, esto apuntará a null. 00:37:53
igual que en la raíz si no hacemos el new, ¿por qué? porque no le he hecho un new 00:38:03
es un puntero algo que será capaz de apuntar a una persona pero no hacerle el new 00:38:07
no le ha asignado el sistema operativo una zona de memoria 00:38:11
con lo cual en principio es null, si yo cojo y digo 00:38:15
mi per 2 igual a mi per 00:38:21
sin necesidad de hacerle el new 00:38:25
mi per 2 ¿qué pasará a valer? pues pasará a valer 00:38:29
lo mismo que vale miper1, dejará de valer null, porque miper2 aquí está valiendo null, y pasará a valer la misma zona de memoria donde esté apuntando miper1. 00:38:33
Aquí, al hacer el new miper1, como siempre haciendo una suposición, vamos a suponer que el sistema operativo le ha dicho que reserva un trocito de memoria RAM 00:38:44
a partir de la zona del número 55.000. 00:38:53
Mi per vale 55.000, que es el trocito a partir de donde van a guardar sus atributos. 00:38:57
Aquí lo que estoy haciendo es mi per 2, que aquí valía nul, 00:39:03
y el sistema operativo no le ha dado ningún espacio de memoria 00:39:07
porque no le hemos hecho un new, le decimos que valga lo mismo que vale mi per. 00:39:09
Entonces si yo cojo y hago eso, va a resultar que mi per 2 va a pasar a valer 00:39:14
posición de memoria 55.000, donde sí que hay un trocito de memoria RAM 00:39:18
reservado con datos de una persona, porque le hemos 00:39:23
hecho este new, y en particular 00:39:26
utilizando la referencia miper 00:39:28
le hemos dado a su nombre noa, con lo cual a partir de 00:39:31
55.000 habrá un trocito de memoria para el nombre, ese nombre 00:39:35
que tendrá noa, y justo este mismo 55.000 00:39:38
está compartido ahora por miper2, entonces si yo pongo 00:39:41
aquí un system.out.println 00:39:44
de miper2.ese 00:39:47
nombre, el único 00:39:53
system out es está referenciado a través de mi perdón yo cojo de aquí y me dice que es no aunque 00:39:56
en realidad sólo habíamos aplicado a través de mi per pero como mi per apunta al mismo sitio que mi 00:40:05
perdón o mi perdón se apunta al mismo que mi per pues ya funciona si yo cojo y comentó esto aquí 00:40:09
mi perdón que es lo que vale bueno de hecho ni siquiera ya me deja aquí fijaros dice inicializa 00:40:18
la variable. Vamos a inicializarla a nul. Como apunta 00:40:24
a nul, no hemos hecho un new para que tenga su propio espacio de memoria y hemos 00:40:31
quitado esta asignación, pues esto ahora me va a dar un error. 00:40:35
¿Entiendo? ¿Veis? Me da una excepción, un null pointer excepción. 00:40:39
Excepción de acceso a un puntero nulo. 00:40:44
Porque mi per2 es nul, lo mismo que nos pasaba antes con los arrays. 00:40:46
¿Alguna aclaración más con esto? ¿Necesitáis alguien por ahí? 00:40:56
Vale, pues mirad, la otra cosa que comentábamos en los foros tenía que ver con intentar asignar a variables, crear variables cuyo nombre se asignan a partir de una variable. 00:40:59
La verdad es que es algo en la que siempre, si fuese posible, uno empieza a pensar muchas alternativas. 00:41:22
Entonces había algo como, se hacía algo así como string ese nombre de la variable. 00:41:31
Y entonces la idea era hacer algo como con un array for, si no recuerdo mal, int igual a cero, 00:41:47
mientras y sea menor, por ejemplo, de tres 00:41:53
y más más. 00:41:57
Es decir, vamos a crear tres variables diferentes, 00:42:01
algo que nos diera una funcionalidad del estilo de un array, 00:42:05
un conjunto de variables, pero vamos a intentar 00:42:09
automatizarlo con un bucle y que cada una de las variables tenga un nombre 00:42:13
distinto. Entonces, 00:42:17
lo que hacía por aquí era decir por ejemplo ese 00:42:19
nombre var que sea igual 00:42:23
al nombre más 00:42:27
entonces como en cada una de las 00:42:33
vueltas fijaros si ponemos aquí un system.out.println 00:42:41
esta variable vamos a sacarlo por pantalla 00:42:47
la ejecución del programa, fijaros que vale 00:42:54
nombre 0, nombre 1, nombre 2, nombre siempre 00:42:57
porque lo tengo aquí de forma literal puesto y luego 00:43:00
en la iteración del bucle desde 0 hasta 2 00:43:03
porque iteramos hasta que 00:43:06
mientras i sea menor de 3 00:43:09
pues me saca las tres alternativas, entonces 00:43:12
lo que a alguien se le ocurría era decir 00:43:15
pues mira, vamos a intentar darle estos nombres a través 00:43:18
de un bucle y creo un grupo de personas 00:43:21
entonces era poner algo aquí como persona 00:43:23
e intentar darle el nombre de la variable 00:43:28
que sabemos que está variando su valor 00:43:32
¿qué es lo que sucede con esto? que cuando definimos una 00:43:36
variable en el programa no me permite que ese nombre 00:43:39
sea variable, tiene que ser un nombre constante, es igual que si 00:43:44
sea para la clase persona o sea para un tipo primitivo 00:43:49
para lo que sea. Si pongo int y esto, pues tampoco me deja. ¿Y qué es lo que está sucediendo en el fondo? Pues lo que está sucediendo es que si esto 00:43:52
no lo va a considerar de partida como una variable para coger cada uno de estos tres valores y está pensando que el nombre que le quiero dar al objeto 00:44:05
de la clase persona es ese nombre par, lo que me está 00:44:13
diciendo es, mira, ese nombre par, ese nombre var 00:44:17
lo tienes definido en este ámbito aquí, o lo tienes definido 00:44:20
en este ámbito aquí, en el mismo ámbito tienes definidas dos variables 00:44:26
con el mismo nombre, que es igual que si intento hacer aquí int i 00:44:31
y long i, pues me dice no, mira 00:44:34
ya si tú asignas aquí un valor a i, no sé si 00:44:38
se lo estás asignando a esta o a esta 00:44:43
con lo cual directamente no dejo que compiles 00:44:45
dos variables no se pueden llamar igual 00:44:46
se llaman diferente y así me deja 00:44:48
pues aquí al final lo que estamos haciendo es eso 00:44:50
estamos dando 00:44:53
a una variable 00:44:54
de tipo string el nombre es en onBar 00:44:55
y estamos dando a una variable de tipo 00:44:58
persona, un objeto de la clase persona 00:45:00
un mismo nombre 00:45:03
entonces dice pues esto no me gusta 00:45:05
y ya está 00:45:06
que era otra de las alternativas que 00:45:08
aparecían por ahí 00:45:12
¿Cómo vamos a trabajar con conjuntos de variables? Pues vamos a trabajar con estructuras dinámicas de datos y con estructuras estáticas. Las estructuras estáticas son los arrays, que ya los estamos conociendo. 00:45:13
Y las dinámicas que también nos sirven para manejar conjuntos de variables, digamos, que pueden ser bien variables primitivas o bien variables referenciadas con las colecciones. 00:45:30
Cada una con sus características particulares. Muy chulas las colecciones para hacer cosas interesantes. Lo vemos en futuros temas ya hasta final de curso. 00:45:45
trabajaremos con las colecciones, ya veréis 00:45:56
que nos dejan hacer cosas interesantes 00:45:58
lo único que bueno 00:46:00
pues los Arrays tienen como ventaja 00:46:02
que proporcionan 00:46:04
programas más eficientes 00:46:06
si la solución se puede 00:46:08
adaptar al Array que las colecciones 00:46:10
pero bueno, conociendo las dos 00:46:12
pues en cada caso utilizaremos una diferente 00:46:14
según nos interese en cada momento 00:46:16
bueno, esta era más o menos la segunda pregunta 00:46:18
yo creo que teníamos por ahí 00:46:23
pero 00:46:24
Pero por poco tiempo, los mapas son colecciones. Hace referencia a esto que os estaba... creo que se me ha quedado pillado la máquina virtual, igual la voy a tener que cerrar y abrir de nuevo. Los mapas son colecciones y las colecciones las vamos a ver en uno de estos temas. 00:47:16
Os estaba diciendo hace un minuto, justo al hilo de esto, que... bueno, bien hecho el apunte. Os estaba diciendo, para trabajar con grupos tenemos o bien los arrays o bien las colecciones, que son chulas y permiten hacer cosas muy interesantes. 00:47:30
Cada uno tiene su ámbito de trabajo, los Arrays, ya os digo, si nos permiten trabajar con Arrays un programa, esos son más eficientes que las colecciones, que llevan más algoritmia para dar las respuestas, pero las colecciones permiten hacer cosas interesantes y trabajando no tanto como haciendo parte del algoritmo por nosotros. 00:47:46
Hay colecciones que te permiten almacenar información, por ejemplo, de objetos de personas ordenadas bajo un determinado criterio o sin que estén ordenadas o que cuando tú vas añadiendo a ese grupo de personas definir qué característica hace dos personas iguales, por ejemplo, que tengan un mismo DNI o que se llamen igual. 00:48:10
En cada programa podría ser un criterio diferente y según eliges una colección u otra, pues te permite el que haya duplicados, o sea, haya entradas duplicadas o no las haya. Yo que sé, imaginaros que, para poneros un pelín en contexto de lo que os cuento, aunque sin entrar en detalles, porque ya tocará en su momento, imaginaros que tienes en el enunciado un programa en el cual estás dando de alta personas en un club de petanca. 00:48:31
Pues si una persona ya añades al grupo ese de personas trabajando mediante una colección que son librerías de Java, ya os digo que ya la veremos, añades a una determinada persona, si quieres añadir esa misma persona de nuevo al club de socios, pues lo normal es que tuvieses que hacer por tu programa unas comprobaciones de que esa persona no se haya asocia, porque no va a ser asocia dos veces. 00:48:58
Entonces, eso lo puedes hacer tú 00:49:21
Tú puedes crear tu estructura en un array de los socios 00:49:25
Pero para hacer esa comprobación en un array 00:49:29
Tendrías que recorrer los socios 00:49:32
Y comprobar que ya no está de alta 00:49:34
En cambio, utilizando una colección 00:49:36
Tú llamas a un método de un objeto de esa colección 00:49:38
Y si estás utilizando la colección correcta 00:49:40
Que no permite duplicados 00:49:43
Pues directamente solo lo añades si no existe ya 00:49:44
Ese código que hay en las librerías 00:49:46
Hará esa comprobación 00:49:49
Pues lo tiene que hacer 00:49:50
Sí, lo tiene que hacer sí o sí, ¿no? Pero lo hace por nosotros simplemente con una llamada a un método. En cambio, imagínate el otro programa en el cual, oye, lo que estoy comprobando no es dar de alta en un club de petanca, sino las visitas que hay a un determinado centro comercial. 00:49:51
Y yo puede ser que vaya por la mañana y vuelva por la tarde. Entonces, igual en este otro enunciado, digamos, el algoritmo que queremos resolver en este caso, si nos interesa, pues crear un grupo, que en este caso será el grupo de personas que han ido a comprar ahí al centro comercial, pero si es duplicados, igual me interesa recogerlo justo en este contexto. 00:50:08
¿Por qué? Porque si hay una misma persona dos veces, quiero que eso se quede registrado. 00:50:27
Pues entonces lo que se haría sería utilizar una colección diferente de todas las que tengo a mi disposición, que en este caso sí aceptaría duplicados. 00:50:31
Igual que con la gestión de duplicados o no duplicados, pues hay colecciones que están ordenadas, que no están ordenadas, según un criterio u otro. 00:50:40
Ya os digo, hay un tema en el que trabajaremos con esto. 00:50:48
entonces para trabajar con grupos de objetos tenemos los arrays o las colecciones y esto que 00:50:50
has visto de los mapas está colgando de las de la funcionalidad de colecciones así que lo veremos 00:50:57
ya voy a cerrar la máquina virtual que si me deja cerrar eclipse no se ha quedado pillada voy a 00:51:05
cerrar la máquina virtual y la arrancó de nuevo entonces pues bueno pues es una solución que sí 00:51:12
que se podría resolver el programa por esa línea, pero ya lo veremos. A ver si arranca bien, ahora 00:51:18
¿dónde puedo cerrar yo la máquina? Uy, se ha quedado, no me da la opción, se ha quedado guardada, no me 00:51:31
da la opción de apagarla por aquí y aquí está pillada. Bueno y vamos a comentar un poquito si 00:52:09
os parece, si podemos dar por cerrado más o menos 00:52:42
estas dos consultas que teníamos abiertas 00:52:44
vamos a hablar un poquito de expresiones regulares 00:52:48
que es algo totalmente nuevo 00:52:50
que sí que aparece en este tema. Mira, las expresiones regulares 00:52:53
no son una cosa exclusiva 00:53:04
ni mucho menos de Java y lo que nos permite 00:53:08
es manejar cadenas 00:53:10
normalmente de caracteres 00:53:13
pero bajo patrones, es decir, ponemos un patrón que hace que se cumpla o no se cumpla, me identifica si se cumple o no se cumple. 00:53:15
Se utiliza mucho, por ejemplo, en las validaciones de campos cuando trabajamos con formularios, todavía no hemos trabajado con formularios, 00:53:26
ya lo haréis, si metes en un campo información de un correo electrónico, pues los correos electrónicos tienen unas determinadas características, 00:53:33
Pues tienen un arroba y antes tienen una parte anterior al arroba, una parte posterior. Entonces, si yo intento en un campo que me dice que meto un correo electrónico, pongo José Manuel solo, pues en el momento de intentar validar esto, pues me comprobará que esta estructura no corresponde a la estructura, no tanto José Manuel o lo que sea, sino que no corresponde a la estructura típica de un correo electrónico. 00:53:44
En cambio, si yo pongo aquí arroba gmail.com, pues me dirá, mira, esta estructura desde la expresión regular, no sé si este correo ha estado de alta en Gmail, pero la estructura sí que sería válida porque tiene un texto por aquí delante, luego tiene aquí un arroba y luego tiene algo que típicamente aquí suele ser un dominio posible de correo. 00:54:08
Entonces coge y le vale. Para comprobar las estructuras, las expresiones regulares, está indicado en el aula virtual. Hay una página que la verdad es que es bastante cómoda para practicar un poco. 00:54:35
a ver si la localizo por aquí, entre los papeles que tengo 00:54:56
para iros contando, bueno, aquí en esta página 00:55:01
pues se pueden poner la estructura regular que quieres comprobar, a ver cómo funciona 00:55:22
y aquí ir poniendo textos para ir 00:55:26
validándolo, mirad, por ejemplo 00:55:30
cuando estamos trabajando con la sintaxis de las estructuras regulares 00:55:33
pues hay un carácter, hay algo que te indica cualquier tipo de carácter 00:55:38
que es el punto, entonces si yo pongo aquí ahora un texto 00:55:42
pues fijaros como me está diciendo que la A 00:55:46
lo cumple, que la B lo cumple, la C lo cumple, realmente 00:55:50
un punto viene a significar cualquier cosa 00:55:54
como cada una de las que lo cumplen pues me lo va poniendo en un color un poquito 00:55:57
diferente, veis aquí azul más clarito, azul más oscuro, de nuevo va alternando 00:56:02
azul claro y azul oscuro, cada uno de estos cumple este bloque 00:56:06
de un punto. Si yo le pongo, por ejemplo, aquí el sombrerito este, a ver, el sombrerito, lo que estoy diciendo es, el sombrerito significa el inicio de la expresión regular. 00:56:10
Entonces aquí decimos, quiero algo que empiece por el sombrerito y que tenga cualquier cosa. Entonces ya en este caso no me vale cualquiera, fijaros, ya solamente me vale este, 00:56:30
porque hemos metido una condición más a la expresión regular que es 00:56:42
que tenga el inicio y tenga un carácter 00:56:46
antes, como no era el inicio, decía, pues mira, me vale cualquiera 00:56:51
de todas ellas, en cambio si cojo y le digo 00:56:55
el inicio, pues ya solamente me vale esta, ¿por qué? porque la B 00:56:57
ya no cumple esa expresión regular, la expresión regular 00:57:03
o la C o la D, la E o el 4, es, cumple la condición 00:57:07
de que es un punto pero no de que se encuentra al principio si lo que quiero es identificar el 00:57:11
inicio y el final el inicio se pone con el sombrerito este que es un carácter que tenemos 00:57:19
justo a la derecha de la p y el final para el final se utiliza en la expresión regular el 00:57:25
dólar entonces ahora lo que estamos diciendo es que quiero que me compruebe lo que hay aquí a 00:57:32
A ver si cumple esta expresión regular, que empiece, o sea, inicio, se encuentre un carácter, el que sea, y termine. 00:57:39
Y esta expresión regular no cumple eso, porque tiene muchas cosas entre el inicio y el final. 00:57:48
Esta es cierto que empieza, tiene un carácter cualquiera, pero no termina, que sería el dólar. 00:57:53
Esta no cumple ni el inicio ni el final, y el 4 lo que no cumple es el inicio. 00:57:59
Al inicio, el 4 no empieza, porque tiene todo esto por delante. 00:58:04
Así que es cierto que es el último. 00:58:08
Si lo dejamos aquí en uno, fijaros como ya sí que lo cumple. 00:58:10
Tiene inicio, cualquier cosa y el final. 00:58:14
Hay algunos caracteres que nos permiten ir manejándolo. 00:58:24
Fijaros aquí a la derecha, por cierto, la aplicación nos va echando una mano de lo que intenta expresar la expresión regular que tenemos aquí puesta. 00:58:32
Hay tres caracteres clave que son la interrogante, una interrogante lo que significa es que lo que le precede puede aparecer cero o una vez, entonces si tenemos aquí el 4 aparece una vez y si lo tuviéramos así pues aparecería cero, también lo cumpliría pero bueno en realidad pues como no tenemos texto por aquí ahora lo comprobamos después. 00:58:42
no podemos ver es que lo que le antecede en este caso el punto es decir cualquier tipo de carácter aparezca cero o una vez si ponemos un más significa que aparezca uno o n veces siendo n hasta infinito vale entonces si ahora cojo y pongo ya aquí a b c fijaros como se sigue cumpliendo todo el rato la expresión regular porque pues porque cualquier cosa puede aparecer o una o n veces 00:59:17
N veces, pues es cualquier número. 00:59:47
Entonces fijaros como ya todo el rato la expresión regular se cumple. 00:59:49
La interrogante era 0, 1, el más es 1, n, y el asterisco es 0, o n. 00:59:58
Ahora metemos alguna cosilla más para ver bien la diferencia. 01:00:05
0, o n veces. 01:00:10
En la expresión regular también podemos poner valores en particular. 01:00:16
Imaginaros que quiero una palabra que empiece siempre por una mayúscula, entonces podemos poner la expresión regular, algo que empiece por A, fijaros, que empiece por A mayúscula y luego tenga cualquier carácter que se puede repetir o cero o n veces, como hemos dicho con el asterisco. 01:00:20
Entonces fijaros, si ahora pongo aquí una A mayúscula, ya se cumple, ¿veis? 01:00:44
Y como es o 0 o n veces, si yo quito todas, como es el asterisco, se sigue cumpliendo. 01:00:48
0 o n veces. 01:00:54
En este caso estaríamos con 0, en este caso estaríamos con 1, 01:00:56
y en este caso con n hasta donde quisiéramos llegar. 01:00:59
Fijaros, el espacio también le vale. 01:01:03
Si yo pongo aquí, en lugar del asterisco, un más, 01:01:08
el más hemos dicho que significa que a lo que antecede que es el punto 01:01:12
aparezca una o n veces, entonces tenemos 01:01:17
cierto que empieza por una A mayúscula, como indica aquí, si pusiéramos una A minúscula 01:01:20
dejaría de cumplirse, ya no me la indica 01:01:25
que es correcta, y luego como es uno o n veces 01:01:29
con el más, estos son n, le vale 01:01:33
esto es la A y uno, que le vale para el más 01:01:36
Pero si le quito este, ya no se cumple, ¿veis? Porque el más es una o n veces, está dejando de cumplir la expresión regular. Tenemos a y tendría que aparecer algo una o n veces al utilizar el más, pues ya no le gusta. 01:01:42
Si ponemos un carácter, ya le vuelve a valer. 01:02:00
Y la interrogante que decíamos antes, hemos dicho que era cero o n veces. 01:02:04
Entonces, tenemos la a y cualquier carácter que es el punto, una vez, cero veces también, porque tenemos la interrogante, 01:02:09
pero si ponemos ya dos, pues ya no le vale. 01:02:18
Tendríamos que manejarlo a través del más o del asterisco según nos interesase. 01:02:22
Respecto al manejo de las repeticiones, tenemos también la posibilidad de poner entre llaves un número de repeticiones. 01:02:32
Entonces, si ponemos aquí tres, un número en particular, lo que le estaríamos diciendo es que en este caso que aparezca una A y cualquier carácter tres veces. 01:02:43
Y tres caracteres. Y cualquier carácter tres veces. 01:02:54
Entonces, fijaros, tenemos un A ahora mismo y un carácter cualquiera dos veces, si ponemos un A, ya lo cumple. Si le metemos otra más, ya no lo cumple. ¿Por qué? Porque son tres veces fijas, según lo hemos puesto ahí. 01:02:58
si ponemos esta expresión regular 01:03:15
lo que estamos diciendo es 01:03:30
una A 01:03:31
y en este caso es cualquier carácter 01:03:32
entre 3 y 5 veces 01:03:36
entonces tenemos la A 01:03:38
y 1, 2, 3, 4 01:03:40
pues bueno, está en el arranque ese que hemos dicho 01:03:42
un quinto carácter también le valdría 01:03:44
si metemos un sexto, ya no cumple la expresión 01:03:46
3 todavía le vale 01:03:48
fijaros la A 01:03:51
1, 2, 3 01:03:52
si quitamos otro más, ya no cumple la expresión 01:03:54
si aquí quitamos el inicio y el final 01:03:57
y mantenemos la expresión regular 01:04:03
fijaros, esto le vale una A y tres caracteres 01:04:05
una A y cuatro caracteres también le valdría 01:04:10
y si ponemos algo aquí de antemano 01:04:13
anterior, todos estos no lo cumplen 01:04:16
pero como hemos quitado la condición de que fuese 01:04:19
desde el principio, este bloque le sigue valiendo 01:04:22
porque se encuentra en un momento dado una A y tres caracteres, lo que dice la expresión regular. 01:04:26
Si yo pongo aquí, fijaros más, se cumple hasta que tiene una A y uno, dos, tres, cuatro y cinco, 01:04:32
que es la propia expresión regular. 01:04:39
Y si yo ahora pongo aquí una A y otra vez cinco caracteres, pues me dice se vuelve a cumplir. 01:04:41
Es decir, poner el inicio o el final nos marca que sea una expresión regular 01:04:46
que cumple por completo la expresión regular, si indicamos 01:04:52
principio y final, si ponemos solo principio, garantizar que 01:04:56
la expresión regular empieza, el texto empieza por esa expresión regular 01:04:59
y si ponemos el dólar, garantizamos que el texto finaliza 01:05:04
con esa expresión regular. Si quitamos inicio y final, pues nos 01:05:08
localiza todas las partes en el texto donde 01:05:12
tenemos la expresión regular recogida. Mira, más cosas. 01:05:14
imaginaos que tenemos que deciros 01:05:25
que, por ejemplo, que queremos 01:05:30
localizar la palabra 01:05:33
que queremos localizar, alumno, en un texto 01:05:37
simplemente poniendo como expresión regular 01:05:42
un texto, esta clase 01:05:49
hay muchos alumnos 01:05:52
Ya veis que diferencia entre mayúsculas y minúsculas, alumnos y alumnas. 01:06:02
Pues nada, fijaros que me ha localizado alumnos, pero no me ha localizado alumnas. 01:06:14
¿Por qué? Porque es lo que he puesto aquí en la expresión regular. 01:06:20
Pero podríamos querer, lógicamente, en este contexto, pues nos interesa tanto los chicos como las chicas, para que nos aparezca. 01:06:22
Entonces la posibilidad de que una de las palabras puede ser una combinación, uno entre varios, lo podemos identificar con corchetes. Entonces en la apertura y cierre de los corchetes ponemos todos aquellos caracteres que nos resulten válidos en ese trozo. 01:06:29
Entonces aquí decimos, tiene que poner alumn, n y una a, una o para que sea alumna o alumno 01:06:50
y luego, bueno, por la s porque estamos hablando de mayúsculas. 01:06:58
Entonces al poner la a y la o, fijaros como ya nos identifica a los dos. 01:07:02
Podemos ponerlo de esta manera, con comas también. 01:07:07
Imaginaos que tenemos alumnus también. 01:07:16
Bueno, pues si tenemos varios lo podemos separar ahí por comas y sin comas también. 01:07:25
Si lo que queremos es un bloque de información, por ejemplo, imaginaos que lo que queremos localizar es aquello que aparezca el número entre 1 y 3 aquí, o entre 5 y 7. 01:07:33
entonces lo que podemos poner es un rango entre 5 y 8 01:07:53
de esta forma, queda un poco raro poner aquí un número 01:07:57
pero si ponemos un 6, fijaros, ponemos aquí un 8 01:08:00
ponemos aquí un 5, de esta forma 01:08:04
podemos identificar un rango, para no poner todos los valores 01:08:09
individualmente que forman ese rango, si tenemos 20 caracteres 01:08:12
y todos van consecutivos uno detrás de otro, pues podríamos 01:08:17
poner desde la A a la P y no tener que poner A, B, C, D, 01:08:21
F, G, H, I, J, K aquí todos. Mira, si ponemos aquí 01:08:25
desde la A a la P, pues me valdría alumnas 01:08:29
alumnus, que también está 01:08:35
por ahí. No, alumno no está, está después de la P. 01:08:38
OP, la O sí. Y en cambio, por ejemplo, la Z 01:08:45
pues no le valdría. ¿Por qué? Porque no está en este rango. Más cosas por ahí 01:08:48
de las expresiones regulares el inicio al final las llaves cualquier carácter el punto si lo que 01:08:59
queremos es identificar algo dentro un corchete pero no decir que es que aparezca uno de esos 01:09:12
caracteres en esa posición sino al contrario decir mira lo que no quiero es que aparezcan 01:09:20
estos caracteres justo dentro del corchete podemos volver a utilizar el sombrerito el 01:09:25
el mismo sombrerito que hemos puesto aquí para representar el inicio 01:09:31
de la expresión regular, lo podemos poner aquí. Entonces, para hacer eso, 01:09:35
si lo ponemos aquí, a ver, ahí lo tenemos el sombrerito. 01:09:40
Ahora lo que hemos hecho ha sido invertir los caracteres que teníamos aquí. 01:09:45
Es decir, lo que le estamos diciendo con el sombrerito es que estos caracteres 01:09:49
justo no sean los que aparecen. Entonces, una vez que hemos puesto esto, 01:09:53
fijaros como ya la A de alumnas 01:09:57
que estaba dentro del bloque este que sí considerábamos válido 01:10:00
ya no nos vale, la O tampoco 01:10:03
porque lo estamos negando aquí y en cambio la Z 01:10:05
que no pertenece a este rango ahora ya sí que le gusta 01:10:08
entonces nos está marcando que la expresión regular se cumple 01:10:12
para alum y con la Z 01:10:15
pero ya no se cumple para alumnos y alumnas 01:10:17
si lo que queremos es tener dos bloques 01:10:21
para un determinado carácter, imaginaos que nos vale 01:10:27
que ponga alumnas, alumnos con este rango 01:10:31
de variables, pero queremos que pueda ser en mayúsculas o minúsculas 01:10:35
pues un primer rango lo identificamos así y a continuación podemos poner aquí en mayúsculas 01:10:39
un segundo rango, entonces ahora si aquí pongo 01:10:44
aluv, la b mayúscula 01:10:49
nb, a ver, pues también le vale 01:10:53
¿Por qué? Estos dos le valen gracias a este rango y puede ser cualquiera de todos los caracteres que identifiquemos aquí, pues este otro rango es el que me está admitiendo que ponga aquí una D. 01:10:59
Mira, por ejemplo, los números binarios. Los números binarios están recogidos con ceros y unos, ¿verdad? En binario aquí en informática, pues esto sería un número binario, cualquier combinación que esté formado con ceros y unos. 01:11:22
Pues si queremos validar que una determinada variable tiene un número binario, 01:11:39
pues podríamos decir que desde el principio y hasta el final todos sus valores sean 0 o 1. 01:11:44
Pero claro, esto me está diciendo que un carácter sea 0 o 1. 01:11:59
Si yo cojo y hago así, me dice que bien, pero en cuanto tengo más, ya no. 01:12:02
entonces, para considerar un número binario 01:12:09
lo quiero considerar que 01:12:12
tenga un número que no tenga ningún 01:12:14
o sea, que no tenga ningún cero o ningún uno, lo consideramos como binario 01:12:18
pues si que lo fuera así, podríamos poner aquí un asterisco 01:12:22
entonces diríamos, esto lo considero 01:12:24
el número binario vacío 01:12:27
si tiene un solo carácter le vale, el asterisco recordad que era 01:12:29
de cero a n 01:12:33
entonces, todo ese le vale 01:12:36
y si el vacío no lo quiero considerar como un número binario 01:12:37
porque es como que no lo has incluido a la hora de valorar la expresión regular 01:12:42
le puedo poner una más 01:12:45
entonces en cuanto tenga un 0 o un 1 ya le vale 01:12:46
fijaros como el 0 aquí aunque esté vacío 01:12:50
me marca aquí que está cumpliendo la expresión regular 01:12:52
lo veis aquí en el rosita 01:12:55
pero si le pongo el más 01:12:56
ya no está cumpliendo la expresión regular 01:12:59
porque tiene que tener al menos una vez el 0 o el 1 01:13:00
entonces yo pongo aquí ya cualquier número y ya le vale 01:13:04
Y si cojo y pongo un número que no sea el 0 y el 1, como no está recogido aquí, pues nada, no le valdría. 01:13:07
Imaginaos que en la expresión regular quiero asegurarme que sea un número en sí. 01:13:19
Pues yo puedo coger y poner aquí. 01:13:25
Podría poner que vaya entre 0 y 9, ese número. 01:13:28
Entonces, cualquier combinación de números le vale. 01:13:33
Cuanto meto una letra, pues ya no le gusta. 01:13:37
esto tiene un atajo si son todos los números que es poner barra de de minúscula veis y ya pues le 01:13:39
gustó es igual que poner de 0 a 9 si ahora ponemos aquí unas letras pues ya no lo cumple y la de 01:13:49
mayúscula lo que hace es indicar que al contrario que lo que tienes ahí dentro no sea un número 01:13:59
cualquier cosa excepto un número entonces como esto tiene números le vale pero si ahora yo pongo 01:14:06
aquí ya empieza a cumplirlo incluso espacios caracteres lo que sea mientras en el momento 01:14:11
que mete un número la barra de mayúscula deja de ser válida y bueno pues podéis poner en mil 01:14:16
situaciones no vamos a pues que para validar ir jugando con las diferentes combinaciones que 01:14:29
tenemos en la sintaxis estoy contando algunas en creo que en el aula virtual bueno pues aparecen 01:14:35
alguna más. Con la W 01:14:40
lo que te 01:14:42
dice es que 01:14:45
ahí, W 01:14:46
minúscula. 01:14:48
Lo que te dice es que, barra W, 01:14:50
perdón, lo que te dice es que este carácter 01:14:53
puede ser 01:14:55
o bien un dígito numérico o una 01:14:56
letra, pero no un símbolo. 01:14:58
Entonces, si yo pongo aquí, si es lo que quiero 01:15:00
valorar, ¿veis? A esto le gusta, 01:15:02
minúsculas también. Ahora, si 01:15:05
pongo algo que 01:15:06
no sea una letra o un número, el dólar por ejemplo, pues ya no le gusta, un espacio 01:15:08
tampoco, el punto tampoco, y si utiliza 01:15:12
la W mayúscula, pues lo que hace es 01:15:16
a ver, voy a poner una mayúscula, ahí está, lo que hace es igual que la D 01:15:21
eran los números y la D mayúscula era lo contrario a los números 01:15:26
la W mayúscula pues lo invierte, entonces le vale la expresión regular 01:15:29
cualquier cosa, siempre y cuando no sean ni números 01:15:34
ni caracteres alfanuméricos 01:15:38
en general. Entonces, a este no le gusta, fijaros 01:15:42
si pongo solo números, tampoco 01:15:46
aún poniendo solo letras, tampoco, pero si pongo solamente 01:15:49
caracteres que no sean alfanuméricos, perdón, he puesto números ahora 01:15:53
pues ya sí le gusta. ¿Por qué? Porque hemos puesto en la expresión regular la W. 01:15:57
Imaginaos que queremos tener 01:16:07
un número 01:16:09
que permita tener decimales 01:16:12
o no decimales. Entonces podríamos 01:16:14
decir números decimales 01:16:16
que tenga al menos un dígito 01:16:21
y después de este bloque, que sea 01:16:23
números decimales que tenga un dígito, 01:16:25
podemos decir que si hay 01:16:27
decimales, solamente 01:16:29
aparezca el punto que 01:16:34
separa la parte entera de la parte decimal 01:16:36
en caso de que haya decimales, pero podemos 01:16:38
poner números que no tengan decimales. 01:16:40
Entonces podríamos poner 01:16:42
para todo el bloque de los decimales, ponemos aquí algo 01:16:43
vamos a poner entre paréntesis 01:16:47
y decirle que esto que pongamos aquí dentro 01:16:51
ahora lo rellenamos, puede aparecer o no. Entonces 01:16:56
si no aparece, bien, y si aparece, lo primero que se encontrará será un punto 01:16:59
pero si ponemos un punto es cualquier cosa. Para utilizar el punto 01:17:04
en sí tenemos que escaparlo. Decimos que sea un punto 01:17:08
verdad, esto era el carácter de cualquier cosa 01:17:11
esto 01:17:13
el punto 01:17:14
y luego si aparece el punto 01:17:16
sí que vamos a necesitar que aparezca 01:17:19
al menos un dígito 01:17:21
entonces le podemos poner aquí 01:17:23
entre corchetes que aparezca un dígito 01:17:24
y vamos a decir por ejemplo 01:17:27
que solo tenga hasta tres decimales 01:17:29
como mucho, que vaya entre uno 01:17:31
y tres 01:17:35
vamos a probar a ver si nos funciona 01:17:37
ponemos cero 01:17:40
punto, bueno, 0 le gusta, es decir, todo este bloque 01:17:42
como esto puede aparecer o no aparecer, en este caso no está apareciendo y ya le gusta 01:17:46
si pongo 0 y un punto, todavía no le gusta, ¿por qué? porque ha aparecido 01:17:52
este punto, es cierto, pero aquí le estoy diciendo que aparezca 01:17:56
entre 1 y 3 decimales, le digo 0,3 01:18:00
2,4, vale, pues ahí está, y si pongo otro más, ya no le gusta 01:18:03
pues vamos a pasar al código, para 01:18:08
hacer y os enseño cómo integrarlo dentro de Java 01:18:19
hasta donde nos dé tiempo. No sé si nos va a dar tiempo del todo. 01:18:23
Bueno, aquí según la síntesis de las expresiones regulares 01:18:28
se pueden validar un montón de cosas. Os cuento un poco ahí 01:18:31
en la teoría. Si tenéis dudas, abrid un hilo 01:18:35
y vamos comentándolo en el aula virtual. Voy a pasar al otro lado para que nos dé tiempo 01:18:39
a ver cómo las expresiones regulares las podemos incorporar al código. 01:18:43
Entonces, nos venimos por aquí. 01:18:49
Y, bueno, en el código hay unas clases que, bueno, os aparecen también en la teoría que nos permite manejarlo y luego ahí, bueno, pues se pueden utilizar en algunas de las funciones que ya conocéis incluso. 01:18:51
fijaros, o que estáis incluso viendo este tema 01:19:11
antes de ir a las propias 01:19:14
librerías que están para las expresiones regulares 01:19:18
vamos a definir una variable aquí 01:19:20
y vamos a meterle aquí un 01:19:23
contenido, por ejemplo vamos a poner 01:19:29
1 y vamos a utilizar 01:19:31
las zetas para luego meterlo en las expresiones regulares 01:19:36
vamos a poner 1, zeta, zeta, aquí dos zetas 01:19:38
2, vamos a poner una zeta mayúscula 01:19:40
vamos a poner varias zetas, este texto, imaginaos que tenemos 01:19:43
en una variable un texto de este tipo, y luego 01:19:53
podemos utilizar en algunos de los métodos que tenemos disponibles en Java 01:19:56
ya directamente, cuando en Eclipse busquéis las opciones 01:20:01
de métodos que os proporcionan, veréis que algunos de los métodos permiten 01:20:05
recibir como parámetro expresiones regulares, una de ellas 01:20:08
en la siguiente, fijaros, imaginaos que tenemos aquí, definimos un string 01:20:13
vamos a poner sres, lo podemos llamar 01:20:17
que lo queremos cargar con información de ese info 01:20:21
si pusiéramos ese info, pues nos cargaría 01:20:25
en sres esto, pero queremos esto, pero modificado 01:20:28
bajo ciertas características, y vamos para ello a definir una expresión 01:20:32
regular, entonces podemos utilizar el método replace 01:20:37
replace all, por ejemplo, y fijaros como aquí el replace all 01:20:40
me ofrece una expresión regular como primer parámetro. 01:20:45
Replace first, replace all 01:20:50
sustituirá todas las ocurrencias de la expresión regular por el texto 01:20:52
que pongamos aquí. Replace first, pues sustituirá la primera 01:20:57
aparición de algo del texto de la expresión regular por lo que 01:21:01
pongamos aquí. Vamos a utilizar un replace all. Entonces, decimos 01:21:05
aquí era donde me indicaba, me pedía la expresión regular, entonces aquí podemos poner 01:21:09
como expresión regular, por ejemplo, podemos decir 01:21:15
aquí, que me sustituya la Z 01:21:23
o la Z, si aparece una o más veces 01:21:27
por el texto 01:21:35
cambio. ¿Qué es lo previsible? Pues que a esta información 01:21:38
va a aplicarle esta expresión regular y donde la encuentre va a sustituir 01:21:54
ese texto por cambio. ¿Aquí qué es lo que estamos diciendo? El carácter Z o Z mayúscula, me da igual cualquiera de los dos, 01:21:58
si aparece una o más veces, ¿y dónde lo tenemos? Pues fijaros, tenemos aquí una o más veces la Z minúscula, 01:22:09
aquí tenemos la Z mayúscula y aquí tenemos varias veces la Z minúscula, vamos a poner una de ellas mayúscula. 01:22:16
Entonces es previsible que esto me lo sustituya por la palabra cambio, que esto me lo sustituya por la palabra cambio 01:22:23
y que esto me lo sustituya por la palabra cambio y lo cargue aquí. 01:22:30
Si hacemos esta ejecución, vamos a ver si de verdad lo hace. 01:22:34
Mirad, lo veis aquí. Me ha efectuado el cambio. 01:22:38
¿Qué es lo que ha cambiado? Pues lo que hemos puesto aquí en una expresión regular. 01:22:41
¿Qué expresión regular nos podemos poner aquí? Pues todas las que estábamos viendo 01:22:45
en el documento. 01:22:48
En el documento, en la web, está en la reges 101. 01:22:52
¿Lo ha cambiado todas? Mira. 01:23:04
dices, si aparece dos veces Z 01:23:06
que pusiera dos veces cambio 01:23:09
no, porque he puesto aquí esto 01:23:11
si quito el más 01:23:17
mira, si quito el más 01:23:19
me aparece cambio, cambio dos veces, porque aquí lo que le estoy 01:23:20
diciendo es que cuando aparezca una Z 01:23:26
una Z mayúscula, que me lo ponga por cambio 01:23:28
pero si le pongo esto, lo que le estoy diciendo 01:23:30
en la expresión regular es que 01:23:32
cuando aparezca esto, una o 01:23:33
n veces, que aplique el cambio 01:23:36
entonces, me aplica esto 01:23:38
mira 01:23:40
A ver, si en lugar de replaceAll pongo un replaceFirst, bueno, pues tenemos la misma jugada de antes, pero con este otro método lo que hace es reemplazar la primera aparición de la expresión regular y no replaceAll. 01:23:42
Bueno, pero esto es para una cosa muy particular de hacerlo aquí, con el método pattern y el matcher, pues te permite hacer una gestión más, de hacer más cosas, esto es simplemente para el replace first, o sea, para hacer un reemplazo, las expresiones regulares aparecen en muchas partes, como parámetros, pues este te lo ofrece y a nivel general para trabajar sobre, si tú lo que quieres, imagínate que es validar un parámetro, 01:24:15
un campo, pues entonces utilizas el dato del pattern matcher 01:24:51
este, que ahora a ver si nos da tiempo a desarrollarlo un poquito 01:24:55
pues para hacer la comprobación de si está y validar si 01:24:59
se ha ido correcto o no ha ido correcto, o sea, si el dato 01:25:03
que estás validando responde a la expresión regular 01:25:06
este método, el replace all de la clase 01:25:10
string, bueno, pues nos ofrece esta posibilidad también 01:25:15
pero no sustituye a la otra necesariamente 01:25:18
01:25:21
pues 01:25:24
claro 01:25:43
bueno, que solamente 01:25:44
sea dos 01:25:53
ah bueno, si solo es una 01:25:54
lo que puedes hacer aquí es poner la expresión regular 01:26:03
de esta forma 01:26:05
decir que la expresión regular 01:26:07
a ver 01:26:09
mira, lo que quieres decir tú 01:26:10
yo creo que es esto, cuando aparezca dos 01:26:13
coma 01:26:15
yo creo que asterisco o sin nada, me parece que sin nada 01:26:16
esto lo que quiere decir es que cuando aparezca dos veces o todas las que sean 01:26:21
quiero que me lo cambies por una Z, lo único que aquí es cierto que te va a cambiar 01:26:25
la mayúscula y la minúscula, ¿vale? por una Z, entonces decimos 01:26:30
ejecutamos aquí, ¿ves? y ahora ya 01:26:35
me deja aquí una Z, esta no la toca, porque está una Z 01:26:39
solo, ¿ves? he puesto que sustituya por una Z minúscula 01:26:44
Entonces estas dos zetas minúsculas me las ha cambiado aquí por una zeta. Esta zeta mayúscula me la ha mantenido y estas dos zetas minúsculas, una mayúscula y una minúscula, me la ha vuelto a sustituir por una zeta. Entonces en ese caso la expresión regular sería esta. 01:26:47
Sí. Vale, mirad, las clases estas que hacéis referencia para el manejo que tenemos en librerías de Java, para el manejo de expresiones regulares, son la pattern y la matcher. 01:27:02
Entonces vamos a ver si nos da tiempo a hacer un pequeño ejercicio para verlo hasta donde lleguemos y si es necesario, si luego seguís con dudas, pues lo mantenemos ahí en el aula virtual con algún hilo. 01:27:18
Vamos a definir una primera variable de tipo string con la expresión regular con la que queremos trabajar. Por ejemplo, vamos a identificar hola con la primera letra que aparezca, mayúsculas, minúsculas, hola, por ahí ponemos. 01:27:34
si queremos considerar un punto 01:27:55
en el hola, si pusiéramos esto, esto significaría 01:28:08
cualquier carácter, entonces hay que escapar esto, en el aula virtual 01:28:12
en la página web que hemos visto antes, hemos puesto este carácter 01:28:16
pero si ponemos un solo carácter, se nos queja a la hora de escaparlo 01:28:19
entonces aquí en Java tenemos que poner dos caracteres, esto lo que estamos diciendo es que 01:28:24
esto lo considere como un punto, que si lo dejamos 01:28:28
así, por tratarse de una expresión regular, va a considerar cualquier palabra. 01:28:32
Si lo mantenemos así, pues expresiones que serían válidas serían 01:28:36
hola z, ¿por qué? Porque la z lo considera un punto. 01:28:39
También valdría hola porque hemos dicho que considere 01:28:44
esto la h mayúscula y minúscula 01:28:48
j, valdría también. Si lo que queremos es 01:28:51
considerar que sea un punto, tenemos que escaparlo. Como Java no lo deja, 01:28:55
lo escapamos dos veces, esto es una cuestión de Java del doble escape 01:28:59
en la página web pusimos un escape solo 01:29:02
entonces estas expresiones ahora ya no serían válidas porque serían válidas esta 01:29:06
y sería válida esta, entonces vamos a utilizar 01:29:12
la expresión regular para hacer ahí varias pruebas en las cuales 01:29:19
ponga hola y acabe con un punto y vamos a decir que el punto 01:29:23
sea opcional para que también me valga hola y hola 01:29:27
¿Vale? Eso en cuanto a la expresión. Y ahora vamos a definir aquí 01:29:33
un string, ese cadena. Esta es la que vamos a ir validando. 01:29:37
Vamos a poner, por ejemplo, hola de inicio aquí. ¿Cómo construimos 01:29:44
una validación con las clases pattern 01:29:50
y matcher, que son dos clases que tenemos disponibles en la librería de Java para trabajar 01:29:55
con las expresiones regulares? Pues primero definimos 01:29:59
un objeto de la clase pattern. Y hacemos uso 01:30:03
de un método estático que tiene, que es, y como es estático, fijaros, 01:30:07
que ponemos pattern punto algo, y lo que hacemos es compilar la expresión. 01:30:13
Y aquí, digamos que estamos definiendo el patrón que vamos a utilizar 01:30:23
como expresión regular, que la tenemos identificada en este string. 01:30:29
Ahí lo tenemos. Fijaros cómo Eclipse me ha incluido de la librería Java 01:30:34
Bautil-Reyes, la clase Pattern. A partir de aquí definimos 01:30:38
un objeto de la clase Matcher 01:30:45
y este objeto en lugar de hacerle un new lo que hacemos 01:30:47
es obtener la referencia del objeto 01:30:56
M desde el patrón 01:31:00
punto, llamamos al método Matcher que tiene y aquí 01:31:06
lo que le pasamos al Matcher es la cadena 01:31:11
que queremos validar. Al pattern con el método compiler le pasamos 01:31:15
la expresión regular. Al matcher, a través de este método del pattern, 01:31:19
le pasamos la que queremos 01:31:25
utilizar. Aquí, matcher con una T solo. 01:31:27
Y ahora, esto lo que tiene son diferentes 01:31:39
métodos. El matcher que nos dice 01:31:42
si aparecen o no aparecen. Si cumple, si 01:31:45
esta cadena cumple esta expresión regular. 01:31:50
Entonces, si utilizamos con un if 01:31:54
el m, que es el objeto de la clase 01:31:57
matcher, el método matches, bueno, ya veis 01:32:04
tiene diferentes métodos por aquí, hasMath 01:32:08
matches, hasMath devuelve un boolean, fine, bueno, tiene muchos, ¿no? 01:32:12
Lo más habitual es el matches, con el método 01:32:16
matches nos devuelve un boolean que será verdadero si cumple si os si cumple por 01:32:20
completo la cadena la expresión regular eso lo que implica el hecho utilizar matches es 01:32:27
que considera el sombrerito el dólar no es aparece en algún sitio en la cadena la 01:32:34
expresión regular no es cumple por completo sería como en el otro sitio poner esto 01:32:45
mirad aquí no me está dejando sería como poner esto en el otro sitio en una expresión regular 01:32:50
el hecho de utilizar matches es lo cumple por completo la expresión regular está recogida en 01:32:57
la palabra en su conjunto en lugar de ponerlo ahí utilizamos el método matches vamos a poner 01:33:03
aquí un system.out.println vamos a poner un cumple luego si nos da tiempo adornamos más el programa 01:33:11
else no cumple 01:33:24
en este caso cumple, fijaros, hola está cumpliendo con esta 01:33:36
expresión regular de principio a fin, pues parece que sí, porque tenemos 01:33:41
la h, la o, la 01:33:45
luego sería un punto, pero ese punto puede aparecer o no aparecer 01:33:48
entonces si damos aquí a ejecutar, me dice que cumple, como es la 01:33:52
expresión regular en su conjunto, si ponemos aquí una a, pues ya no 01:34:01
cumpliría, porque estamos utilizando el método machis. 01:34:05
Entonces dice ya que no cumple, ¿veis? 01:34:07
También hemos dicho que podría aparecer 01:34:11
el punto no aparecer 01:34:12
con este trocito de la expresión 01:34:14
regular. 01:34:16
Sin él, hemos visto que nos dice que cumple 01:34:18
y con el punto 01:34:20
pues también la debería cumplir 01:34:22
porque estamos diciendo que podría aparecer un punto 01:34:24
o no aparecer. 01:34:26
Pues también cumple. 01:34:29
Si ponemos dos puntos 01:34:31
pues ya no cumple. 01:34:32
Si ponemos aquí un más 01:34:37
a ver si localizo el más aquí, pues ahora diríamos 01:34:38
que el punto tiene que aparecer una o n veces, no cero o una 01:34:45
entonces le damos aquí y ahora ya dice que cumple a pesar de que tiene dos puntos 01:34:49
pero como es una o n, si quito esto, ahora ya me dice que no cumple 01:34:53
¿por qué? porque no tiene ningún punto, si pongo aquí un asterisco, cero puntos me valdría 01:34:58
pues sí me valdría, ¿veis? ya sigue cumpliendo 01:35:02
bueno, pues en función de la cadena 01:35:06
que queramos validar, que la pondremos aquí en el matcher 01:35:10
y de la expresión regular con la que queremos validar 01:35:14
esa cadena, que la pondríamos aquí en el compile 01:35:18
a través de una estructura de selección con un if 01:35:22
y el método matches, somos capaces de 01:35:26
aquí hacer lo que toque cuando cumple y aquí probablemente sería 01:35:30
mostrar un mensaje diciendo no cumples el correo electrónico que has puesto aquí 01:35:34
que has recogido aquí no cumple con la expresión regular de los correos electrónicos. 01:35:38
En definitiva, aquí te muestro un mensaje o te dejo en un bucle hasta que pongas bien el correo 01:35:44
o ya veremos a ver lo que hacemos. 01:35:48
El objeto de la clase Matcher nos permite comprobar la expresión regular de principio a fin, 01:35:53
pero luego tiene más métodos. 01:36:01
Entonces, si en lugar de Matches ponemos aquí, utilizamos el método Lookinat, 01:36:02
Esto lo que hace es mirar a ver si aparece en algún sitio 01:36:10
No a ver si lo cumple o no lo cumple 01:36:21
Entonces, esta expresión 01:36:24
Cumple, vamos a poner aquí para saber los dos mensajes 01:36:26
Cumple looking, no cumple looking 01:36:30
Entonces, cumple looking, cumple de normal 01:36:35
Si lo cumple estrictamente, lógicamente lo va a cumplir en el looking 01:36:40
Pero si yo pongo aquí una A aquí ahora 01:36:45
A ver, ¿qué es lo que he hecho por aquí mal? Ah, vale, bien. ¿Por qué me dice que no cumple el looking? A ver, vale, sí, perdón que lo estaba diciendo mal. El looking at no lo busca en cualquier sitio de la cadena, sino que lo busca al principio, si lo cumple al principio. 01:36:47
A ver, exactamente, perdonad, os lo había dicho mal. El método matches mira que toda la expresión, que toda la cadena cumpla la expresión. Entonces, en este caso, como tiene hola, pero luego tiene esto, pues no cumple el matching. 01:37:30
en cambio el looking at lo que hace es comprobar a ver si lo cumple al principio es como si 01:37:52
tuviéramos simplemente el sombrerito pero no tuviéramos el dólar aquí entonces dice que 01:37:58
cumple el looking para localizarlo en cualquier sitio tenemos el método find que sería no 01:38:01
considerar ni el sombrerito ni el dólar al final entonces si hacemos que cumple de forma estricta 01:38:18
Ahora vamos modificando. 01:38:42
Mirad, el fine no le vale encontrarlo, no lo considera. 01:38:55
Como tienes el looking at, entiendo que te lo localiza al principio. 01:38:58
Con el fine, si te lo cumple desde el principio, dice que no cumple. 01:39:03
Fijaros. 01:39:07
¿Veis? No cumple fine cuando cumple looking at. 01:39:09
Cumple el normal y el looking at. 01:39:12
Pero si dejamos aquí un espacio, algo anterior, no cumple la cadena normal, 01:39:14
no cumple el looking porque no está al principio, pero cumple el fine. 01:39:21
Es decir, la primera, el find, no te considera la primera de las veces 01:39:30
si se encuentra al principio, porque dice, bueno, ya lo validarás 01:39:34
con el lookinat, entiendo. 01:39:38
Yo, con el find, te voy a dar la solución para cuando no puedas utilizar 01:39:40
el lookinat al principio. 01:39:45
Mira, si ponemos aquí cualquier cosa, este no cumplirá la expresión regular, 01:39:48
no cumple el 01:39:54
ah, no, un momentito 01:39:56
que no es 01:40:02
creo, a ver, un segundín 01:40:04
mira, voy a poner esto 01:40:05
pero voy a comentar porque yo creo 01:40:08
que no va a ser exactamente ese el motivo 01:40:10
vamos a comentar el lookinat, un momentito 01:40:12
fijaros, he vuelto 01:40:14
aquí al principio, veis, sin dejar 01:40:29
el espacio ese en la parte 01:40:31
de adelante, vale, y ahora ya dice que cumple el fine 01:40:33
vale, os cuento 01:40:35
que es lo que estaba pasando, antes 01:40:36
os he dicho, os estaba comentando, pues parece que el find 01:40:38
como ya el servicio encontrado al principio lo tiene el looking at, pues el find 01:40:42
te encuentra las siguientes, por eso esta nos decía 01:40:46
el find que no cumple cuando si había cumplido el looking 01:40:51
up, pero en realidad no es eso, en realidad lo que sucede 01:40:55
es que estos métodos, el looking at y el find, lo que 01:40:59
hace es localizarlo y va avanzando digamos un cursor, que es lo 01:41:03
que ha hecho aquí? Bueno, el machis no avanzó un cursor, dice si cumple o no cumple 01:41:10
y luego se ha encontrado un lookinat, entonces ha dicho 01:41:14
¿lo he encontrado? Sí, hola, pues digo que lo cumplo. 01:41:17
Y como ya lo he encontrado este, lo que hago es avanzar el cursor y lo pongo por aquí 01:41:21
o por aquí, no sé exactamente dónde, después de la expresión. Y dice 01:41:25
¿cumple el find después? Y dice ya, como he avanzado 01:41:29
el cursor por aquí, ya no lo encuentro, entonces me dice que no cumple. 01:41:33
En cambio, si no hago el lookinat inicial, el cursor cuando llega al find, ¿dónde está? En el inicio de la expresión regular. Entonces, a pesar de que no tiene nada adelante, al no haber hecho un lookinat y haber avanzado el cursor de búsqueda, ya me dice que cumple el find. 01:41:37
Esto lo podemos gestionar con uno y con otro, a ver, haciendo un reset, creo. 01:41:58
A ver, reset, sí. 01:42:07
El método reset del matcher lo que hace es, si he avanzado con el cursor, 01:42:09
porque ya he ido encontrándolo y lo que espero es encontrar nuevas ocurrencias de la expresión regular, 01:42:15
con un reset lo que hago es volver a traer el cursor aquí al principio. 01:42:20
Entonces, si yo ahora cojo y ejecuto aquí, ¿veis? 01:42:24
Ya me dice que no cumple el matcher, lógicamente no lo cumple porque tengo este texto por aquí, pero cumple el looking at, ¿por qué? Porque lo encuentro al principio, el looking at en realidad habrá avanzado el cursor hasta por aquí probablemente, hasta aquí, si no tuviéramos este reset el find buscaría partir de aquí y diría que no cumple, pero como hemos hecho un reset lo que conseguimos es que el cursor se me vuelva aquí al principio, con lo cual el find también me lo encuentra. 01:42:27
Y si yo pongo aquí otro hola, fijaros, el matcher no me lo cumplirá, el looking at me lo cumplirá porque lo encuentra aquí y el find me lo encontrará una vez y dos veces. 01:42:54
Entonces vamos a, en lugar de poner un for, un if aquí, vamos a poner aquí un while. 01:43:13
Mientras lo vaya encontrando, sácame que cumple el find. 01:43:24
fijaros que este bucle, aunque no tengamos ningún avance en particular 01:43:29
por código, en realidad sí que está avanzando porque cada find 01:43:34
va avanzando el cursor, entonces encontrará aquí un find, luego dirá 01:43:37
que encuentra aquí otro, y cuando haya encontrado este llegará aquí 01:43:42
y dirá pues ya no lo he encontrado más veces, con lo cual es previsible 01:43:46
que con esto, con el find me salga dos veces, veis 01:43:50
me dice no cumple el matcher, cumple el looking 01:43:55
es verdad que habrá avanzado el cursor, pero como hacemos un reset, nos lo traemos al principio 01:43:59
de nuevo y cumple dos veces el find, ¿veis? que es 01:44:04
una este y otra este 01:44:07
y ya para terminar, por lo menos por aquí 01:44:11
mostraros que cuando hacemos 01:44:16
de este cursor del que os estoy hablando y cuando lo va encontrando 01:44:21
pues tenemos a ver un mstart, que es donde 01:44:25
empieza cuando lo ha encontrado la aparición 01:44:29
de la expresión regular dentro del texto 01:44:33
y un stop, y un end 01:44:37
entonces si ejecutamos esto, fijaros 01:44:47
que dice, no cumple, efectivamente como hemos dicho antes 01:45:02
cumple el looking at, está al principio, y el 01:45:05
find lo encuentra dos veces, una y dos, y dice 01:45:09
que aparece la expresión regular 01:45:14
en el texto entre el carácter 0 con una longitud de 4 01:45:18
desde el carácter 0, 1, 2, 3 y 4 01:45:21
y luego dice que en el 10, del 10 al 14 01:45:24
entonces, 1, 2, 3, 4, 5, 6, 7 01:45:28
8, 9, 10 y el 11, 12, 13 y 14 01:45:34
de esta forma podemos localizar donde aparece 01:45:37
A través de esto podríamos hacer un replace en esta cadena, pues podríamos, lo único que ahora tendríamos que hacer un replace no con la expresión regular, sino que ir haciendo replace desde estas posiciones para cambiarla por el texto que nos gustase, por ejemplo. 01:45:41
Digamos, el pattern y el matcher son dos clases disponibles en las librerías de Java que nos permiten trabajar con expresiones regulares, localizando las expresiones regulares dentro de textos para luego aquí tener la posibilidad de hacer lo que nosotros queramos. 01:46:02
escribieron una base de datos, no sé qué nombre, apareció tres veces. 01:46:19
He sustituido esto por esto. 01:46:23
Al final, no un texto por otro, sino una expresión regular 01:46:25
por el texto que sea o lo que toque hacer. 01:46:29
Pero nos da la posibilidad de gestionar expresiones regulares 01:46:32
para hacer búsquedas de esos patrones dentro de cadenas de caracteres 01:46:35
y los otros métodos, como el que os he enseñado antes, 01:46:39
era una cosa más particular, que no viene de Perlas, 01:46:42
pero para hacer un replays o un replays all 01:46:46
como en un stream 01:46:48
bueno, me hubiera gustado hacer algunos ejercicios más 01:46:49
por aquí, cosas tenía apuntadas 01:46:56
no sé si fuera de 01:46:58
este primer examen, pues podemos 01:47:00
algún día en la siguiente tutoría 01:47:02
repasamos un poco más alguna cosita 01:47:04
pero hoy ya no nos da más tiempo 01:47:06
desafortunadamente 01:47:08
así que 01:47:10
no sé, sí, dime 01:47:12
alguien me pregunta por Google 01:47:13
sí, sí, sí 01:47:15
hasta este tema incluido 01:47:20
si necesitáis desarrollar algo más de este tema 01:47:22
como no os he dado tiempo a muchas tutorías, pues preguntadme por ahí 01:47:26
por los foros, ya sabéis que intento andar pendiente 01:47:28
y poca cosa más, esta clase os la subo ahora al aula 01:47:31
bueno, ahora o a lo largo del día porque siempre 01:47:36
tardo un rato en subir y bueno 01:47:39
pues os veo la semana que viene a los que os animéis a hacer el examen 01:47:42
a ver que tal os va 01:47:44
¿alguna preguntilla queréis antes de cerrar? 01:47:45
no, pues venga, por aquí lo dejamos ya 01:47:56
Venga, hasta la semana que viene. Hasta luego. 01:47:58
Materias:
Programación
Niveles educativos:
▼ Mostrar / ocultar niveles
  • Formación Profesional
    • Ciclo formativo de grado superior
      • Primer Curso
Autor/es:
JM
Subido por:
Jose Manuel M.
Licencia:
Dominio público
Visualizaciones:
23
Fecha:
3 de febrero de 2025 - 19:29
Visibilidad:
Clave
Centro:
IES ALONSO DE AVELLANEDA
Duración:
1h′ 48′ 05″
Relación de aspecto:
1.78:1
Resolución:
1920x1080 píxeles
Tamaño:
193.95 MBytes

Del mismo autor…

Ver más del mismo autor


EducaMadrid, Plataforma Educativa de la Comunidad de Madrid

Plataforma Educativa EducaMadrid