Está en la página 1de 45

ITSON Manuel Domitsu Kono

Tema 11
Expresiones Regulares en Java

Una expresin regular es una secuencia de caracteres y smbolos, un patrn,
que define un conjunto de cadenas. Las expresiones regulares pueden usarse
para comparar (y reemplazar) texto en un archivo, datos suministrados a una
aplicacin, datos capturados en un formulario, anlisis lexicogrfico, etc.

Si se usa una expresin para analizar o modificar un texto, se dice que la
expresin regular se aplica al texto. El patrn definido por una expresin regular
se aplica a una cadena de izquierda a derecha. Una vez que un carcter de la
cadena se ha usado, no puede reutilizarse. Por ejemplo la expresin regular aba
se ajusta a la cadena match "ababababa"slo dos veces (aba_aba__).

Los constructores de una expresin regular incluyen caracteres, clases de
caracteres, cuantificadores y metacaracteres.
Caracteres
En una expresin regular se usan caracteres alfanumricos normales y caracteres
especiales. Los caracteres especiales se escriben como secuencias de escape.
Los diferentes caracteres que se pueden emplear en una expresin regular se
muestran en la tabla 11.1

Tabla 11.1 Caracteres
Caracter Descripcin
Alfa-
numrico
Todos los caracteres alfanumricos coinciden con s mismos. Por ejemplo, la
expresin regular 2 casas coincide con la cadena 2 casas.
\ \
Coincide con el carcter \
\ n Coincide con el carcter de salto de lnea.
\ f Coincide con el carcter de salto de forma.
\ r Coincide con el carcter retorno de carro.
\ t Coincide con el carcter tabulador
\ v Coincide con el carcter tabulador vertical.
\ cX Coincide con el carcter de control x
\ 0n Coincide con el carcter cuyo cdigo es el valor octal 0n (0 <=n <=7)
\ 0nn Coincide con el carcter cuyo cdigo es el valor octal 0nn (0 <=n <=7)
\ 0mnn Coincide con el carcter cuyo cdigo es el valor octal 0mnn (0 <=m <=3, 0 <=n <=7)
\ xhh
Coincide con el carcter cuyo cdigo es el valor hexadecimal xhh.
\ xhhh
Coincide con el carcter cuyo cdigo es el valor hexadecimal xhhh.
Nota: En J ava las secuencias de escape se tienen que escribir con dos \\ ya que en s el carcter \
se representa por la secuencia de escape \ \ : \ \ 0, \ \ n, \ \ f , etc.

384 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono
Clases de Caracteres
Las clases de caracteres se utilizan para definir el contenido de un patrn. Esto es,
lo que el patrn debe buscar. Las diferentes clases de caracteres que se pueden
emplear en una expresin regular se muestran en la tabla 11.2

Tabla 11.2 Clases de Caracteres
Smbolo Descripcin Ejemplo
[ xyz] Coincide con un solo de los caracteres
del conjunto de caracteres encerrado
entre los corchetes.
[ ABc] coincide con A o con B o
con c pero no con D o con 7.
[ ^xyz] Negacin. Coincide con un solo de los
caracteres que no est en el conjunto de
caracteres encerrado entre los
corchetes. Se pueden usar un guin
para denotar un rango.
[ ^AB] coincide con C, F y H pero
no con A o B.
[ a-z] Coincide con un solo de los caracteres
del conjunto de caracteres dado por el
rango.
[ a-zA-Z] coincide con una de las
letras minsculas o maysculas.
[ ^a-z] Coincide con un solo de los caracteres
del conjunto de caracteres que no est
dado por el rango.
[ ^a-zA-Z] coincide con un
carcter que no sea una letra
minscula o mayscula.
[ a- d[ m- p] ] Unin. Coincide con cualquier carcter
que este ya sea en el primer o segundo
grupo
[ a- d[ m- p] ] coincide con uno de
los caracteres a a d o ma p.
[ a- z&&[ def ] ] Interseccin. Coincide con cualquier
carcter que est en ambos grupos
[ a- z&&[ def ] ] coincide con uno
de los caracteres d, e o f .
[ a- z&&[ ^bc] ] Substraccin. Coincide con cualquier
carcter que est en el primer grupo
pero no en el segundo.
[ a- z&&[ ^bc] ] coincide con uno
de los caracteres a, d a z.
. Coincide con cualquier carcter excepto
el carcter salto de lnea o cualquier
carcter UNICODE terminador de lnea.
Coincide con a, b, - , etc. pero
no con \ n
\ w Coincide con cualquier carcter
alfanumrico, incluyendo al guin bajo.
Es equivalente a [ a- zA- Z0- 9_] .
Coincide con a, b, C, _, etc.
pero no con %o &
\ W Coincide con cualquier carcter no
alfanumrico. Es equivalente a [ ^a-
zA- Z0- 9_] .
Coincide con %, #, &, etc. pero
no con a, b, C, o _.
\ d Coincide con cualquier dgito. Equivale a
[ 0- 9] .
Coincide con 3, 4, 2, etc. pero no
con N, o p
\ D Coincide con cualquier carcter que no
sea un dgito. Equivale a [ ^0- 9] .
Coincide con N, p, #, etc, pero no
con 3, 4, o 2.
\ s Coincide con cualquier carcter de
espacio. Equivale a [ \ t \ r \ n\ v\ f ] .

\ S Coincide con cualquier carcter que no
sea un carcter de espacio. Equivale a
[ ^\ t \ r \ n\ v\ f ] .

Nota: En J ava las secuencias de escape se tienen que escribir con dos \\ ya que en s el carcter \
se representa por la secuencia de escape \ \ w: \ \ W, \ \ d, \ \ D, etc.


Tema 11 Expresiones Regulares en Java 385
ITSON Manuel Domitsu Kono
Operadores Lgicos
Los operadores lgicos de la tabla 11.3 nos permiten combinar caracteres o clases
de caracteres para formar expresiones regulares ms complejas.

Tabla 11.3 Operadores Lgicos
Operador Descripcin Ejemplo
XY
Coincide con la expresin regular X seguida
por la expresin regular Y.
aBc coincide con aBc.
a-\d coincide con a- 0, a-1, a-2, etc.
[ a- f ] [ ^a- f ] coincide con un carcter
en el rango a- f seguido de un carcter
fuera del rango a- f .
X| Y
Coincide con la expresin regular X o con la
expresin regular Y.
a| Bc coincide con ac, o con Bc.
Cuantificadores
Los cuantificadores definen cuantas veces aparecer un elemento en una
expresin. Los diferentes cuantificadores que se pueden emplear en una
expresin regular se muestran en la tabla 11.4

Tabla 11.4 Cuantificadores
Smbolo Descripcin Ejemplo
X{n}
Coincide exactamente con n ocurrencias de
la expresin regular X.
\ d{5} coincide exactamente con 5
dgitos
X{n, }
Coincide con n o ms ocurrencias de una
expresin regular X.
\ s{2, } coincide con al menos a dos
caracteres de espacio.
X{m, n}
Coincide con ma n ocurrencias de una
expresin regular X.
\ d{2, 4} coincide con al menos 2 pero
no ms de cuatro dgitos.
X? Coincide con cero o una ocurrencias de una
expresin regular X. Equivale a {0, 1}
a\ s?b coincide con " ab" o " a b" .
X* Coincide con cero o ms ocurrencias de una
expresin regular X. Equivale a {0, }
/ ab*c/ coincide con " ac" , " abc" ,
" abbc" , " abbbc" , etc.
X+ Coincide con una o ms ocurrencias de una
expresin regular X. Equivale a {1, }
ab+c coincide con " abc", a " abbc" ,
a " abbbc" , etc.
Metacaracteres de Frontera
Los metacaracteres de frontera nos permiten especificar en qu parte de una
cadena buscar por una coincidencia con la expresin regular. Algunos de estos
metacaracteres se muestran en la tabla 11.5.

Tabla 11.5. Metacaracteres de Frontera
Patrn Descripcin Ejemplo
^ Slo busca coincidencias al inicio
de una lnea
^hol a coincide con hol a pero no con
di j o hol a
$ Slo busca coincidencias al final
de una lnea
$ol a coincide con hol a pero no a ol as


386 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono
Tabla 11.5. Metacaracteres de Frontera. Cont.
Patrn Descripcin Ejemplo
\b Busca coincidencias en cualquier
frontera de palabra (principio o
final de una palabra).
Ol a\ b coincide slo con la primera ol a en
hol a l e di j o a l as ol as
\B Busca coincidencias en cualquier
lugar excepto en las frontera de
palabra
\ Bol a coincide slo con la primera ol a en
hol a l e di j o a l as ol as
\A Slo busca coincidencias al inicio
de la secuencia completa

\ z Slo busca coincidencias al final
de la secuencia completa

\ G
Busca coincidencias al final de de
la coincidencia anterior
\ Gol a coincide dos veces en ol aol as
Captura de Grupos
La captura de grupos nos permite tratar mltiples caracteres como si fueran una
unidad simple. Para capturar un grupo se encierran los caracteres que forman el
grupo entre parntesis, (), tabla 11.6.

Tabla 11.6 Alternado o Agrupado
Smbolo Descripcin Ejemplo
( ) Agrupa caracteres para crear una clusula.
Pueden ir anidados
( abc) +( def ) coincide con una o ms
ocurrencias de " abc" , seguidas de una
ocurrencia de " def " .

La porcin de la cadena que coincide al grupo capturado se almacena para futura
referencia. Los grupos capturados se enumeran contando el nmero de parntesis
izquierdos de izquierda a derecha. Por ejemplo en la expresin ( ( A) ( B( C) ) ) hay
cuatro grupos:

1. ( ( A) ( B( C) ) )
2. ( A)
3. ( B( C) )
4. ( C)

Hay un grupo especial llamado grupo 0 que representa la expresin completa,
pero que no se incluye en la cuenta de grupos.
Referencias
Para hacer referencia a la porcin de la cadena que coincide al grupo capturado
dentro de una expresin regular se usa el carcter diagonal invertida \ seguido
del nmero del grupo capturado. Por ejemplo, la expresin regular (\d\d)\1 nos
indica que se va a capturar un grupo formado por dos dgitos contiguos, y que el
patrn a ajustar sern esos dos dgitos seguidos de los mismos dos dgitos.

La expresin regular anterior coincide con 1212 pero no con 1234

Tema 11 Expresiones Regulares en Java 387
ITSON Manuel Domitsu Kono
Bsquedas Hacia Adelante y Hacia Atrs
Las operaciones de bsqueda hacia adelante nos permiten crear expresiones
regulares para determinar si un patrn va seguido o no de otro patrn en una
cadena.

Las operaciones de bsqueda hacia atras nos permiten crear expresiones
regulares para determinar si un patrn termina o no en otro patrn en una cadena.

En la tabla 11.7 se muestran las diferentes operaciones de bsqueda hacia
adelante y hacia atrs. Estas operaciones no crean una referencia numerada para
los caracteres que coinciden con la expresin regular dentro de los parntesis.

Tabla 11.7 Alternado o Agrupado
Smbolo Descripcin Ejemplo
( ?: X)
Coincide con la expresin regular X
pero no la captura.
( ?: . d) {2} coincide pero no captura a
cdad" .
X( ?=Y)
Coincide con la expresin regular X si
y slo s va seguida de la expresin
regular Y. Y no forma parte del patrn
al que se va a ajustar la cadena, slo
es una condicin para el ajuste.
.
J uan ( ?=Per ez) coincide con " J uan" en
" J uan Per ez" pero no en " J uan Ramos" o
en " J uan Lopez" .

J uan ( ?=Per ez| Lopez) coincide con
" J uan" en " J uan Per ez" o en " J uan
Lopez" pero no en " J uan Ramos" .
x( ?! y)
Coincide con la expresin regular X si
y slo s no va seguida de la
expresin regular Y. Y no forma parte
del patrn al que se va a ajustar la
cadena, slo es una condicin para el
ajuste.
^\ d+ ( ?! meses) coincide con " 5" en " 5
di as" o en " 5 hor as" , pero no en " 5
meses" .
X( ?<=Y)
Coincide con la expresin regular X si
y slo s termina en la expresin
regular Y. Y no forma parte del patrn
al que se va a ajustar la cadena, slo
es una condicin para el ajuste.
.
J uan ( ?<=Per ez) coincide con " J uan
Per ez" en " J uan Per ez" pero no en
" J uan Ramos" o en " J uan Lopez" .

J uan ( ?=Per ez| Lopez) coincide con
" J uan Per ez" en " J uan Per ez" o en
" J uan Lopez" " en " J uan Lopez" pero
no en " J uan Ramos" .
x( ?<! y)
Coincide con la expresin regular X si
y slo s no termina de la expresin
regular Y. Y no forma parte del patrn
al que se va a ajustar la cadena, slo
es una condicin para el ajuste.
^\ d+ ( ?! meses) coincide con " 5 di as" en
" 5 di as" o en " 5 hor as" , en " 5 hor as"
pero no en " 5 meses" .
Ejemplos Sobre Expresiones Regulares
1. La siguiente expresin regular define un patrn que se ajusta a una cadena
vaca o que contiene slo caracteres blancos:

^\ \ s*$
388 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono
^Significa que para que una cadena se ajuste al patrn, debe coincidir
desde el inicio de la cadena.
\ \ s* indica una secuencia de 0, 1 o ms caracteres blancos.
$ Significa que para que una cadena se ajuste al patrn, debe coincidir
hasta el final de la cadena.

El patrn anterior se ajusta a cadenas como:

" "
" "
" \ n"
" \ t "
" \ n"

Si omitiramos el metacaracter ^, el patrn \ \ s*$, aparte de ajustarse a
las cadenas anteriores, hallara coincidencias en cadenas que tuvieran 0 o
ms caracteres blancos al final como en:

" xxx"
" xxx "
" xxx\ n"
" xx yy "

En el ltimo ejemplo, el patrn coincidira con los dos ltimos caracteres de
espacio y no con los intermedios ya que esos no ocurren al final de la
cadena. Por otro lado, si en el patrn original omitiramos el metacaracter
$, el patrn ^\ \ s*, aparte de ajustarse a las cadenas a las que se ajusta el
patrn original, hallara coincidencias en cadenas que tuvieran 0 o ms
caracteres blancos al inicio como en:

" xxx"
" xx "
" \ nxxx\ n"
" xx yy"

En el ltimo ejemplo, el patrn coincidira con los dos primeros caracteres
de espacio y no con los intermedios ya que esos no ocurren al inicio de la
cadena. Por ltimo si omitiramos los metacaracteres ^y $, el patrn
^\ \ s*, hallara coincidencias en todas las cadenas, tengan espacios o no.

2. La siguiente expresin regular define un patrn formado slo por 3 letras
maysculas seguidas de 4 dgitos:

^[ A- Z] {3}\ \ d{4}$

[ A- Z] {3} indica una secuencia de 3 caracteres maysculos seguidos.
\ \ d{4} indica una secuencia de 4 dgitos seguidos.

El patrn anterior se ajusta a las siguientes cadenas:
Tema 11 Expresiones Regulares en Java 389
ITSON Manuel Domitsu Kono
" ABC0123"
" DFR8953" .

3. La siguiente expresin regular define un patrn para una fecha en el
formato dd/mm/aaaa:

" ^( ( [ 0- 2] ?\ \ d) | ( [ 3] [ 0- 1] ) ) \ \ / ( ( [ 0] ?\ \ d) | ( [ 1] [ 0- 2] ) ) \ \ / ( \ \ d{4}) $"

( ( [ 0- 2] ?\ \ d) | ( [ 3] [ 0- 1] ) ) Indica que podemos tener un dgito; un
cero, un uno o un dos seguido de un dgito; o un tres seguido de un cero o
un uno.
\ \ / Indica una diagonal.
( [ 0] ?\ \ d) | ( [ 1] [ 0- 2] ) ) Indica un dgito; un cero seguido de un dgito;
o un 1 seguido por un cero, un uno o un dos.
( \ \ d{4}) Indica cuatro dgitos.
El paquete java.uti.regex
La API de J ava contiene, en el paquete , una serie de clases que nos permiten
determinar si una secuencia de caracteres se ajusta a un patrn definido por una
expresin regular. Esas clases se muestran en el diagrama de clases de la figura
11.1.
La InterfazMatchResult

interfaz Mat chResul t declara mtodos que nos permiten consultar el resultado
de un ajustar una secuencia de caracteres contra una expresin regular. Los
mtodos de esta interfaz se muestran en la figura 11.8.

Tabla 11.8 Mtodos de la Interfaz MatchResult
i nt start( )

Regresa la posicin, dentro de la secuencia de caracteres, del primer carcter de una
coincidencia.

Lanza:
I l l egal St at eExcept i on - Si no se ha intentado an ajustar la secuencia de
caracteres al patrn o si no la operacin de ajuste previa fall.

390 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono

Figura 11.1 Diagrama de Clases de las Clases de Expresiones Regulares

Tabla 11.8 Mtodos de la Interfaz MatchResult. Cont.
i nt start( i nt gr oup)

Regresa la posicin, dentro de la secuencia de caracteres capturada por el grupo del parmetro,
del primer carcter de una coincidencia. Si hubo una coincidencia pero no con el grupo mismo, el
mtodo regresa -1.

Lanza:
I l l egal St at eExcept i on - Si no se ha intentado an ajustar la secuencia de
caracteres al patrn o si no la operacin de ajuste previa fall.
I ndexOut Of BoundsExcept i on Si no hay un grupo capturado en el patrn con el
ndice del parmetro.
i nt end( )

Regresa la posicin, dentro de la secuencia de caracteres, despus del ltimo carcter de una
coincidencia.

Lanza:
I l l egal St at eExcept i on - Si no se ha intentado an ajustar la secuencia de
caracteres al patrn o si no la operacin de ajuste previa fall.





Tema 11 Expresiones Regulares en Java 391
ITSON Manuel Domitsu Kono
Tabla 11.8 Mtodos de la Interfaz MatchResult. Cont.
i nt end( i nt gr oup)

Regresa la posicin, dentro de la secuencia de caracteres capturada por el grupo del parmetro,
despus del ltimo carcter de una coincidencia. Si hubo una coincidencia pero no con el grupo
mismo, el mtodo regresa -1.

Lanza:
I l l egal St at eExcept i on - Si no se ha intentado an ajustar la secuencia de
caracteres al patrn o si no la operacin de ajuste previa fall.
I ndexOut Of BoundsExcept i on Si no hay un grupo capturado en el patrn con el
ndice del parmetro.
St r i ng group( )

Regresa la subsecuencia de la secuencia de caracteres que se ajusta al patrn. Si el parmetro
se ajusta a una cadena vaca, el mtodo regresa una cadena vaca.

Lanza:
I l l egal St at eExcept i on - Si no se ha intentado an ajustar la secuencia de
caracteres al patrn o si no la operacin de ajuste previa fall.
St r i ng group( i nt gr oup)

Regresa la subsecuencia de la secuencia de caracteres capturada por el grupo del parmetro. Si
hubo una coincidencia pero no con el grupo mismo, el mtodo regresa nul l . Si el parmetro se
ajusta a una cadena vaca, el mtodo regresa una cadena vaca.

Lanza:
I l l egal St at eExcept i on - Si no se ha intentado an ajustar la secuencia de
caracteres al patrn o si no la operacin de ajuste previa fall.
I ndexOut Of BoundsExcept i on Si no hay un grupo capturado en el patrn con el
ndice del parmetro.
i nt groupCount( )

Regresa el nmero de grupos en el patrn. No incluye el grupo cero.

La Clase Matcher
La clase Mat cher es la mquina que realiza las operaciones de ajuste de una
secuencia de caracteres a un patrn definido por la clase Pat t er n. Un ajustador,
que es una instancia de la clase Mat cher se crean invocando al mtodo
mat cher ( ) de un patrn, que es una instancia de la clase Pat t er n. Algunos de
los mtodos de la clase Mat cher y que podemos usar para realizar tres diferentes
tipos de operaciones de ajuste, se muestran en la tabla 11.9:



392 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono
Tabla 11.9 Mtodos de la Clase Matcher.
publ i c bool ean matches( )

Intenta ajustar la secuencia de caracteres completa al patrn. Regresa t r ue si y slo s la
secuencia completa se ajusta al patrn.

Si el ajuste tiene xito, se puede obtener ms informacin usando los mtodos: st ar t ( ) , end( ) ,
y gr oup( ) .
publ i c bool ean find( )

Intenta encontrar la siguiente subsecuencia de la secuencia de caracteres que se ajusta al patrn.
Regresa t r ue si y slo s hay una subsecuencia de la secuencia de caracteres que se ajusta al
patrn. Este mtodo inicia al principio de la secuencia o si la invocacin previa tuvo xito, y el
ajustador no fue restaurado, al primer carcter que no coincidi en el ajuste previo.

Si el ajuste tiene xito, se puede obtener ms informacin usando los mtodos: st ar t ( ) , end( ) ,
y gr oup( ) .
publ i c bool ean find( i nt st ar t )

Restablece este ajustador y luego intenta encontrar la siguiente subsecuencia de la secuencia de
caracteres que se ajusta al patrn, a partir del ndice especificado por el parmetro st ar t .
Regresa t r ue si y slo s hay una subsecuencia de la secuencia de caracteres que se ajusta al
patrn, a partir del ndice especificado. Las siguientes invocaciones del mtodo f i nd( ) iniciarn
al primer carcter que no coincidi en este ajuste.

Si el ajuste tiene xito, se puede obtener ms informacin usando los mtodos: st ar t ( ) ,
end( ) , y gr oup( ) .

Lanza:
I ndexOut Of BoundsExcept i on Si el parmetro st ar t <0 o si es mayor a la
longitud de la secuencia de caracteres.
publ i c bool ean lookingAt( )

Intenta ajustar la secuencia de caracteres al patrn, a partir del inicio de la secuencia. Regresa
t r ue si y slo s un prefijo de la secuencia se ajusta al patrn.

Si el ajuste tiene xito, se puede obtener ms informacin usando los mtodos: st ar t ( ) ,
end( ) , y gr oup( ) .
publ i c Pat t er n pattern( )

Regresa el patrn que es interpretado por este ajustador.
publ i c Mat cher reset( )

Restablece este ajustador. Al restablecerlo se descarta toda su informacin explcita sobre su
estado y se establece la posicin de agregado a cero. El mtodo regresa este ajustador.




Tema 11 Expresiones Regulares en Java 393
ITSON Manuel Domitsu Kono
Tabla 11.9 Mtodos de la Clase Matcher. Cont.
publ i c Mat cher reset( Char Sequence i nput )

Restablece este ajustador con una nueva secuencia de caracteres. Al restablecerlo se descarta
toda su informacin explcita sobre su estado y se establece la posicin de agregado a cero. El
mtodo regresa este ajustador.
publ i c Mat cher usePattern( Pat t er n newPat t er n)

Cambia el patron usado por este ajustador para encontrar coincidencias al patrn del parmetro.
El mtodo regresa este ajustador.

Este mtodo hace que el ajustador pierda la informacin acerca de los grupos del ltimo ajuste. La
posicin del ajustador en la secuencia de caracteres se mantiene y la ltima posicin de agregado
no se ve afectada.

Lanza:
I l l egal Ar gument Except i on Si el parmetro es nul l .
publ i c St r i ng replaceAll( St r i ng r epl acement )

Regresa una cadena en la que cada subsecuencia de la secuencia de caracteres que se ajusta al
patrn es reemplazada por la cadena del parmetro.

Por ejemplo, dada la expresin regular a*b, la secuencia de caracteres
" aabf ooaabf ooabf oob" y la cadena de reemplazo " - " , la invocacin a este mtodo regresa la
cadena " - f oo- f oo- f oo- " .
publ i c St r i ng replaceFirst( St r i ng r epl acement )

Regresa una cadena en la que la primera subsecuencia de la secuencia de caracteres que se
ajusta al patrn es reemplazada por la cadena del parmetro.

Por ejemplo, dada la expresin regular can, la secuencia de caracteres " zzzcanzzzcanzzz" y
la cadena de reemplazo "gat o" , la invocacin a este mtodo regresa la cadena
" zzzgat ozzzcanzzz" .
publ i c Mat cher appendReplacement( St r i ngBuf f er sb, St r i ng r epl acement )

Este mtodo hace las siguientes acciones:

1. Le agrega al St r i ngBuf f er del parmetro sb, la subsecuencia de la secuencia de
caracteres desde el punto de agregado hasta antes del primer carcter de la
subsecuencia que se ajusta al patrn.
2. Le agrega al St r i ngBuf f er del parmetro sb, la cadena de reemplazo dada por el
parmetro r epl acement .
3. Establece el valor del punto de reemplazo a la siguiente posicin del ltimo carcter de la
subsecuencia que se ajusta al patrn.

Lanza:
I l l egal St at eExcept i on - Si no se ha intentado an ajustar la secuencia de
caracteres al patrn o si no la operacin de ajuste previa fall.




394 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono
Tabla 11.9 Mtodos de la Clase Matcher. Cont.
publ i c St r i ngBuf f er appendTail( St r i ngBuf f er sb)

Este mtodo lee caracteres de la secuencia de entrada a partir de la posicin de agregado y los
agrega al St r i ngBuf f er del parmetro sb.

Este mtodo se usa normalmente junto con los mtodos f i nd( ) y appendRepl acement () para
hacer una bsqueda y reemplazo. Por ejemplo, el siguiente cdigo le agrega al St r i ngBuf f er
sb, la secuencia " un gat o, dos gat os en el pat i o" :

Pat t er n p = Pat t er n. compi l e( " gat o" ) ;
Mat cher m= p. mat cher ( " un per r o, dos per r os en el pat i o " ) ;
St r i ngBuf f er sb = new St r i ngBuf f er ( ) ;
whi l e ( m. f i nd( ) ) {
m. appendRepl acement ( sb, " dog" ) ;
}
m. appendTai l ( sb) ;
La Clase Pattern
La clase Pat t er n es una representacin compilada de una expresin regular.

Una cadena con una expresin regular debe compilarse a una instancia de esta
clase. El patrn resultante puede crearse para crear un ajustador que pueda
ajustar secuencias de caracteres a expresiones regulares.

Algunos de los atributos y mtodos de la clase Pat t er n y que podemos usar para
realizar tres diferentes tipos de operaciones de ajuste, se muestran en laa tablas
11.10 y 11.11:

Tabla 11.10 Atributos de la Clase Pattern.
publ i c st at i c f i nal i nt CASE_INSENSITIVE

Establece que el ajuste se har sin hacer distincin entre minsculas y maysculas.
publ i c st at i c f i nal i nt MULTILINE

Activa el modo multilnea.

En el modo multilnea los metacaracteres ^y $ se ajustan hasta despus o hasta antes de un
carcter terminador de lnea o el final de la secuencia de entrada, respectivamente. Por omisin
los metacaracteres slo se ajustan al principio y final de la secuencia de caracteres completa.
publ i c st at i c Pat t er n compile( St r i ng r egex)

Compila la expresin regular del parmetro a un patrn

Lanza:
Pat t er nSynt axExcept i on - Si la sintaxis de la expresin regular es invlida.


Tema 11 Expresiones Regulares en Java 395
ITSON Manuel Domitsu Kono
Tabla 11.1 Mtodos de la Clase Pattern.
publ i c st at i c Pat t er n compile( St r i ng r egex, i nt f l ags)

Compila la expresin regular del parmetro r egex a un patrn con las banderas dadas por el
parmetro f l ags. Dos de las banderas son: CASE_I NSENSI TI VE y MULTI LI NE. Las banderas
pueden combinarse usando el operador or para bits | .

Lanza:
Pat t er nSynt axExcept i on - Si la sintaxis de la expresin regular es invlida.
I l l egal Ar gument Except i on Si una de las banderas no es vlida.
publ i c Mat cher matcher( Char Sequence i nput )

Crea y regresa un ajustador que ajustar la secuencia de caracteres del parmetro a este patrn.
publ i c st at i c bool ean matches( St r i ng r egex, Char Sequence i nput )

Compila la expresin regular del parmetro r egex a un patrn e intenta ajustarlo a la secuencia
de caracteres del parmetro i nput .

Regresa t r ue si y slo s la secuencia completa se ajusta al patrn.

La invocacin a este mtodo produce el mismo resultado que la expresin:

Pat t er n. compi l e( r egex) . mat cher ( i nput ) . mat ches( )

Lanza:
Pat t er nSynt axExcept i on - Si l a si nt axi s de l a expr esi n r egul ar es
i nvl i da.
publ i c Pat t er n pattern( )

Regresa el patrn que es interpretado por este ajustador.
publ i c Mat cher reset( )

Restablece este ajustador. Al restablecerlo se descarta toda su informacin explcita sobre su
estado y se establece la posicin de agregado a cero. El mtodo regresa este ajustador.
publ i c St r i ng pattern( )

Regresa la expresin regular de la que se compil este patrn.












396 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono
Tabla 11.11 Mtodos de la Clase Pattern. Cont.
publ i c St r i ng[ ] split( Char Sequence i nput )

Separa la secuencia de caracteres del parmetro en subcadenas tomando las coincidencias con
este patrn como separadores. El mtodo regresa un arreglo con las subcadenas obtenidas. Las
subcadenas en el arreglo aparecen en el orden en que ocurrieron en la secuencia de caracteres.
Si este patrn no se ajusta a ninguna subsecuencia de la secuencia de caracteres, entonces el
arreglo slo tendr un elemento, la secuencia de caracteres completa como una cadena. Las
cadenas vacas al final del arreglo sern descartadas.

Por ejemplo, la secuencia de caracteres " boo: and: f oo" produce los siguiente resultados con
esas expresiones regulares:

Expresin Regular Contenido del Arreglo
: {" boo" , " and" , " f oo" }
o {" b" , " " , " : and: f " }


publ i c St r i ng[ ] split( Char Sequence i nput , i nt l i mi t )

Separa la secuencia de caracteres del parmetro en subcadenas tomando las coincidencias con
este patrn como separadores. El mtodo regresa un arreglo con las subcadenas obtenidas. Las
subcadenas en el arreglo aparecen en el orden en que ocurrieron en la secuencia de caracteres.
Si este patrn no se ajusta a ninguna subsecuencia de la secuencia de caracteres, entonces el
arreglo slo tendr un elemento, la secuencia de caracteres completa como una cadena.

El parmetro l i mi t controla el nmero de veces que se aplica el patrn y por lo tanto afecta al
tamao del arreglo. Si el valor de l i mi t <0, entonces el patrn se aplicar cuando mucho l i mi t
-1 veces, la longitud del arreglo no ser mayor a l i mi t , y el ltimo elemento del arreglo
contendr la subsecuencia con todos los caracteres despus de la ltima coincidencia. Si l i mi t
es negativo, el patrn se aplicar tantas veces como sea posible y el arreglo tendr esa longitud.
Si l i mi t es cero, el patrn se aplicar tantas veces como sea posible, el arreglo podr tener
cualquier longitud y las cadenas vacas al final del arreglo sern descartadas.

Por ejemplo, la secuencia de caracteres " boo: and: f oo" produce los siguiente resultados con
esas expresiones regulares:

Expresin Regular l i mi t Contenido del Arreglo
: 2 {" boo" , " and: f oo" }
: 5 {" boo" , " and" , " f oo" }
: - 2 {" boo" , " and" , " f oo" }
o 5 {" b" , " " , " : and: f " , " " , " " }
o - 2 {" b" , " " , " : and: f " , " " , " " }
o 0 {" b" , " " , " : and: f " }


Tema 11 Expresiones Regulares en Java 397
ITSON Manuel Domitsu Kono
La Excepcin PatternSyntaxException
Esta excepcin no verificada se utiliza para indicar errores en los patrones de
expresiones regulares. Esta excepcin hereda de I l l egal Ar gument Except i on
que a su vez hereda de RuntimeException. Los mtodos adicionales de esta clase
se muestran en la tabla 11.12

Tabla 11.12 Excepcin PatternSyntaxException.
publ i c PatternSyntaxException( St r i ng desc, St r i ng r egex, i nt i ndex)

Construye una nueva instancia de esta clase con la descripcin del error, la expresin regular con
el error y el ndice aproximado del error o -1 si no se conoce la posicin.
publ i c i nt getIndex( )

Regresa el ndice aproximado del error o -1 si no se conoce la posicin.
publ i c St r i ng getDescription( )

Regresa la descripcin del error.
publ i c St r i ng getPattern( )

Regresa la expresin regular con el error.
publ i c St r i ng getMessage( )

Regresa una cadena multilnea con la descripcin del error de sintaxis y su ndice. La expresin
regular invlida y una indicacin visual del ndice del error en la expresin.

Este mtodo sobrescribe el mtodo get Message( ) de la clase Thr owabl e.
La clase String y Las Expresiones Regulares
La clase St r i ng de la API de J ava tiene un conjunto de mtodos que nos permite
realizar algunas de las operaciones con expresiones regulares. Esos mtodos se
muestran en el diagrama de clases de la figura 11.2 y en la tabla 11.13.

Figura 11.2. Mtodos de la Clase String para Expresiones Regulares.






398 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono
Tabla 11.13 Mtodos de la Clase String para Expresiones Regulares.
publ i c bool ean matches( St r i ng r egex)

Regresa t r ue si y slo s esta cadena se ajusta a la expresin regular de su parmetro.

La invocacin a este mtodo produce el mismo resultado que la expresin:

Pat t er n. mat ches( r egex, st r )

Donde st r es la cadena de esta clase.

Lanza:
Pat t er nSynt axExcept i on - Si la sintaxis de la expresin regular es invlida.
publ i c St r i ng replaceAll( St r i ng r egex, St r i ng r epl acement )

Regresa una cadena en la que cada subcadena de esta cadena que se ajusta a la expresin
regular del parmetro r egex es reemplazada por la cadena del parmetro r epl acement .

La invocacin a este mtodo produce el mismo resultado que la expresin:

Pat t er n. compi l e( regex) . mat cher ( str) . r epl aceAl l ( r epl acement )

Donde st r es la cadena de esta clase.

Lanza:
Pat t er nSynt axExcept i on - Si la sintaxis de la expresin regular es invlida.
publ i c St r i ng replaceFirst( St r i ng r egex, St r i ng r epl acement )

Regresa una cadena en la que la primera subcadena de esta cadena que se ajusta a la expresin
regular del parmetro r egex es reemplazada por la cadena del parmetro r epl acement .

La invocacin a este mtodo produce el mismo resultado que la expresin:

Pat t er n. compi l e( regex) . mat cher ( str) . r epl aceFi r st ( r epl acement )

Donde st r es la cadena de esta clase.

Lanza:
Pat t er nSynt axExcept i on - Si la sintaxis de la expresin regular es invlida.








Tema 11 Expresiones Regulares en Java 399
ITSON Manuel Domitsu Kono
Tabla 11.13 Mtodos de la Clase String para Expresiones Regulares.
publ i c St r i ng[ ] split( St r i ng r egex)

Separa la secuencia de caracteres del parmetro en subcadenas tomando las coincidencias con
este patrn como separadores. El mtodo regresa un arreglo con las subcadenas obtenidas. Las
subcadenas en el arreglo aparecen en el orden en que ocurrieron en la secuencia de caracteres.
Si este patrn no se ajusta a ninguna subsecuencia de la secuencia de caracteres, entonces el
arreglo slo tendr un elemento, la secuencia de caracteres completa como una cadena. Las
cadenas vacas al final del arreglo sern descartadas.

La invocacin a este mtodo produce el mismo resultado que la expresin:

Pat t er n. compi l e( r egex) . spl i t ( st r )

Donde st r es la cadena de esta clase.

Lanza:
Pat t er nSynt axExcept i on - Si la sintaxis de la expresin regular es invlida.
publ i c St r i ng[ ] split( St r i ng r egex, i nt l i mi t )

Separa la secuencia de caracteres del parmetro en subcadenas tomando las coincidencias con
este patrn como separadores. El mtodo regresa un arreglo con las subcadenas obtenidas. Las
subcadenas en el arreglo aparecen en el orden en que ocurrieron en la secuencia de caracteres.
Si este patrn no se ajusta a ninguna subsecuencia de la secuencia de caracteres, entonces el
arreglo slo tendr un elemento, la secuencia de caracteres completa como una cadena.

El parmetro l i mi t controla el nmero de veces que se aplica el patrn y por lo tanto afecta al
tamao del arreglo. Si el valor de l i mi t <0, entonces el patrn se aplicar cuando mucho l i mi t
-1 veces, la longitud del arreglo no ser mayor a l i mi t , y el ltimo elemento del arreglo
contendr la subsecuencia con todos los caracteres despus de la ltima coincidencia. Si l i mi t
es negativo, el patrn se aplicar tantas veces como sea posible y el arreglo tendr esa longitud.
Si l i mi t es cero, el patrn se aplicar tantas veces como sea posible, el arreglo podr tener
cualquier longitud y las cadenas vacas al final del arreglo sern descartadas.

Pat t er n. compi l e( r egex) . spl i t ( st r , l i mi t )

Donde st r es la cadena de esta clase.

Lanza:
Pat t er nSynt axExcept i on - Si la sintaxis de la expresin regular es invlida.
Ejemplos sobre las Clases para Expresiones Regulares
1. La siguiente clase tiene mtodos que nos permiten leer un archivo texto con
cdigo J ava, guardarlo en una cadena, borrarle los comentarios y escribirlo
a otro archivo texto.

400 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono
BorraComentarios.java
/ *
* Bor r aComent ar i os. j ava
*/
package bor r aComent ar i os;

i mpor t j ava. i o. *;
i mpor t j ava. ut i l . r egex. Mat cher ;
i mpor t j ava. ut i l . r egex. Pat t er n;

/ **
* Est a cl ase l ee un ar chi vo de cdi go J ava, l e qui t a l os coment ar i os y
* escr i be el r esul t ado en ot r o ar chi vo.
*
* @aut hor Manuel Domi t su
*/
publ i c cl ass Bor r aComent ar i os {
St r i ng nomAr chi voEnt r ada;
St r i ng nomAr chi voSal i da;

/ **
* Est e const r uct or i ni ci al i za l os at r i but os de l a cl ase e i nvoca a l os
* met odos que abr en el ar chi vo f uent e, bor r an l os coment ar i os y
* escr i ben el r esul t ado en ot r o ar chi vo.
*
* @par amnomAr chi voEnt r ada Nombr e del ar chi vo con el codi go f uent e
* en j ava
* @par amnomAr chi voSal i da Nombr e del ar chi vo con l os r esul t ados
*/
publ i c Bor r aComent ar i os( St r i ng nomAr chi voEnt r ada,
St r i ng nomAr chi voSal i da) {
St r i ng f uent eCC, f uent eSC;

t hi s. nomAr chi voEnt r ada = nomAr chi voEnt r ada;
t hi s. nomAr chi voSal i da = nomAr chi voSal i da;

/ / Lee el ar chi vo con el codi go f uent e
f uent eCC = l eeAr chi vo( ) ;

/ / Bor r a l os coment ar i os
f uent eSC = bor r aComent ar i os( f uent eCC) ;

/ / Escr i be l os r esul t ados en un ar chi vo t ext o
escr i beAr chi vo( f uent eSC) ;
}

/ **
* Est e met odo abr e el ar chi vo con el codi go f uent e, l o l ee l i nea por
* l i nea, l as guar da en una cadena de t i po St r i ng.
* @r et ur n Una cadena con el cont eni do del ar chi vo de ent r ada
*/
publ i c St r i ng l eeAr chi vo( ) {
Fi l eReader f i l eReader ;
Buf f er edReader buf f er edReader ;
St r i ng l i nea;
St r i ngBuf f er f uent e = new St r i ngBuf f er ( ) ;
Tema 11 Expresiones Regulares en Java 401
ITSON Manuel Domitsu Kono

/ / Abr e el ar chi vo con el codi go f uent e
t r y {
f i l eReader = new Fi l eReader ( nomAr chi voEnt r ada) ;
} cat ch ( Fi l eNot FoundExcept i on f nf e) {
Syst em. out . pr i nt l n( " Er r or : No exi st e el ar chi vo "
+ nomAr chi voEnt r ada) ;
r et ur n nul l ;
}

/ / Se envuel ve el ar chi vo con el codi go f uent e con un ar chi vo
/ / del t i po Buf f er edReader par a ef i ci ent ar su acceso
buf f er edReader = new Buf f er edReader ( f i l eReader ) ;

t r y {
whi l e ( t r ue) {
/ / Obt en l a si gui ent e l i nea del ar chi vo con el codi go f uent e
l i nea = buf f er edReader . r eadLi ne( ) ;

/ / Si ya no hay l i neas, t er mi na el ci cl o
i f ( l i nea == nul l ) {
br eak;
}

/ / Agr ega l a l nea al St r i ngbuf f er
f uent e. append( l i nea) ;
/ / Agr ega un sal t o de l nea al St r i ngbuf f er
f uent e. append( " \ n" ) ;
}
buf f er edReader . cl ose( ) ;
f i l eReader . cl ose( ) ;

r et ur n f uent e. t oSt r i ng( ) ;
} cat ch ( I OExcept i on i oe) {
Syst em. out . pr i nt l n( " Er r or al pr ocesar el ar chi vo"
+ nomAr chi voEnt r ada) ;
r et ur n nul l ;
}
}

/ **
* Est e met odo escr i be en un ar chi vo t ext o, el cont eni do del ar chi vo
* f uent e de J ava de ent r ada si n l os coment ar i os
* @par amf uent eSC Ar chi vo f uent e de J ava de ent r ada si n l os
* coment ar i os
*/
publ i c voi d escr i beAr chi vo( St r i ng f uent eSC) {
Fi l eWr i t er f i l eWr i t er ;
Buf f er edWr i t er buf f er edWr i t er ;

/ / Abr e el ar chi vo donde se escr i bi r an l os r esul t ados
t r y {
f i l eWr i t er = new Fi l eWr i t er ( nomAr chi voSal i da) ;
} cat ch ( I OExcept i on i oe) {
Syst em. out . pr i nt l n( " Er r or , no se pudo cr ear el ar chi vo"
+ nomAr chi voSal i da) ;
r et ur n;
402 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono
}

/ / Se envuel ve el ar chi vo donde se escr i bi r an l os r esul t ados con un
/ / ar chi vo del t i po Buf f er edWr i t er par a ef i ci ent ar su acceso
buf f er edWr i t er = new Buf f er edWr i t er (
( Out put St r eamWr i t er ) ( f i l eWr i t er ) ) ;

t r y {
buf f er edWr i t er . wr i t e( f uent eSC) ;

buf f er edWr i t er . cl ose( ) ;
f i l eWr i t er . cl ose( ) ;
} cat ch ( I OExcept i on i oe) {
Syst em. out . pr i nt l n( " Er r or al escr i bi r al ar chi vo"
+ nomAr chi voSal i da) ;
}
}

/ **
* Est e met odo bor r a l os coment ar i os de l nea, mul t i l nea y de
* document aci n de ar chi vos con cdi go J ava.
* Fal l a si una cadena l i t er al cont i ene dos di agonal es segui das
*/
publ i c St r i ng bor r aComent ar i os( St r i ng f uent eCC) {
/ / Cr ea una expr esi n r egul ar que el i mi ne l os coment ar i os
St r i ng exReg = " ( ?: / \ \ *( ?: [ ^*] | ( ?: \ \ *+[ ^*/ ] ) ) *\ \ *+/ ) | ( ?: / / . *$) " ;

/ / Compi l a l a expr essi on r egul ar en un pat r on
Pat t er n p = Pat t er n. compi l e( exReg, Pat t er n. MULTI LI NE) ;

/ / Cr ea un aj ust ador par a el t ext o del ar chi vo
Mat cher m= p. mat cher ( f uent eCC) ;

/ / Reempl aza l os coment ar i os por una cadena vaci a
r et ur n m. r epl aceAl l ( " " ) ;
}
}

Para probar el cdigo de la clase anterior se tiene la siguiente clase de
prueba:

PruebaBorraComentarios.java
/ *
* Pr uebaBor r aComent ar i os. j ava
*/
package bor r aComent ar i os;

/ **
* Est a cl ase si r ve par a pr obar l a cl ase Bor r aComent ar i os que l ee un
* ar chi vo de cdi go J ava, l e qui t a l os coment ar i os y
* escr i be el r esul t ado en ot r o ar chi vo.
*
* @aut hor Manuel Domi t su Kono
Tema 11 Expresiones Regulares en Java 403
ITSON Manuel Domitsu Kono
*/
publ i c cl ass Pr uebaBor r aComent ar i os {

/ **
* Met odo mai n( ) . I nvoca a l os met odos de l a cl ase Bor r aComent ar i os
* @par amar gs Ar gument os en l a l i nea de comando
*/
publ i c st at i c voi d mai n( St r i ng[ ] ar gs) {
Pr uebaBor r aComent ar i os pr uebaBor r aComent ar i os = new
Pr uebaBor r aComent ar i os( ) ;

/ / Cr ea un obj et o del t i po Bor r aComent ar i os y l e pasa l os
/ / nombr es de l os ar chi vos con el codi go f uent e y el codi go
/ / f uent e si n coment ar i os
Bor r aComent ar i os bor r aComent ar i os = new Bor r aComent ar i os(
" sr c\ \ bor r aComent ar i os\ \ Bor r aComent ar i os. j ava" ,
" sr c\ \ bor r aComent ar i os\ \ si nComet ar i os. j ava" ) ;
}
}

2. La siguiente clase tiene mtodos que nos permiten leer un archivo texto con
cdigo J ava, contar el nmero de veces que ocurre cada palabra reservada
y escribirlo los resultados a otro archivo texto.

Estadsticas2.java
/ *
* Est adi st i cas2. j ava
*/
package est adi st i cas;

i mpor t j ava. i o. *;
i mpor t j ava. ut i l . Map;
i mpor t j ava. ut i l . Tr eeMap;
i mpor t j ava. ut i l . r egex. Mat cher ;
i mpor t j ava. ut i l . r egex. Pat t er n;

/ **
* Est e pr ogr ama l ee un ar chi vo t ext o que cont i ene el codi go f uent e de
* una cl ase de J ava y cuent a el numer o de veces que apar ecen l as
* pal abr as r eser vadas. Los r esul t ados l os al macena en ot r o ar chi vo
* t ext o.
*/
publ i c cl ass Est adi st i cas2 {
St r i ng nomAr chi voEnt r ada;
St r i ng nomAr chi voSal i da;

/ **
* Est e const r uct or i ni ci al i za l os at r i but os de l a cl ase e i nvoca a l os
404 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono
* met odos que abr en el ar chi vo f uent e, cuent an l as pal abr as r eser vadas
* y escr i ben el r esul t ado en ot r o ar chi vo.
*
* @par amnomAr chi voEnt r ada Nombr e del ar chi vo con el codi go f uent e en
* j ava
* @par amnomAr chi voSal i da Nombr e del ar chi vo con l os r esul t ados
* @par ampal abr as l i st a de l as pal abr as r eser vadas a buscar .
*/
publ i c Est adi st i cas2( St r i ng nomAr chi voEnt r ada, St r i ng nomAr chi voSal i da,
St r i ng pal abr as[ ] ) {
St r i ng f uent e;
Map<St r i ng, I nt eger > cuent aPal abr as;

t hi s. nomAr chi voEnt r ada = nomAr chi voEnt r ada;
t hi s. nomAr chi voSal i da = nomAr chi voSal i da;

/ / Lee el ar chi vo con el codi go f uent e
f uent e = l eeAr chi vo( ) ;

/ / Cuent a l as pal abr as r eser vadas
cuent aPal abr as = pr ocesaAr chi vo( f uent e, pal abr as) ;

/ / Escr i be l os r esul t ados en un ar chi vo t ext o
escr i beResul t ados( cuent aPal abr as) ;
}

/ **
* Est e met odo abr e el ar chi vo con el codi go f uent e, l o l ee l i nea por
* l i nea, l as guar da en una cadena de t i po St r i ng.
*
* @r et ur n Una cadena con el cont eni do del ar chi vo de ent r ada
*/
publ i c St r i ng l eeAr chi vo( ) {
Fi l eReader f i l eReader ;
Buf f er edReader buf f er edReader ;
St r i ng l i nea;
St r i ngBuf f er f uent e = new St r i ngBuf f er ( ) ;

/ / Abr e el ar chi vo con el codi go f uent e
t r y {
f i l eReader = new Fi l eReader ( nomAr chi voEnt r ada) ;
} cat ch ( Fi l eNot FoundExcept i on f nf e) {
Syst em. out . pr i nt l n( " Er r or : No exi st e el ar chi vo "
+ nomAr chi voEnt r ada) ;
r et ur n nul l ;
}

/ / Se envuel ve el ar chi vo con el codi go f uent e con un ar chi vo del
/ / t i po Buf f er edReader par a ef i ci ent ar su acceso
Tema 11 Expresiones Regulares en Java 405
ITSON Manuel Domitsu Kono
buf f er edReader = new Buf f er edReader ( f i l eReader ) ;

t r y {
whi l e ( t r ue) {
/ / Obt en l a si gui ent e l i nea del ar chi vo con el codi go f uent e
l i nea = buf f er edReader . r eadLi ne( ) ;

/ / Si ya no hay l i neas, t er mi na el ci cl o
i f ( l i nea == nul l ) {
br eak;
}

/ / Agr ega l a l nea al St r i ngbuf f er
f uent e. append( l i nea) ;
/ / Agr ega un sal t o de l nea al St r i ngbuf f er

f uent e. append( " \ n" ) ;
}
buf f er edReader . cl ose( ) ;
f i l eReader . cl ose( ) ;

r et ur n f uent e. t oSt r i ng( ) ;
} cat ch ( I OExcept i on i oe) {
Syst em. out . pr i nt l n( " Er r or al pr ocesar el ar chi vo"
+ nomAr chi voEnt r ada) ;
r et ur n nul l ;
}
}

/ **
* Est e met odo escr i be en un ar chi vo t ext o, l as ocur r enci as de cada
* pal abr a r eser vada en un ar chi vo con codi go f uent e de J ava.
*
* @par amcuent aPal abr as Mapa con l as ocur r enci as de cada pal abr a
* r eser vada
*/
publ i c voi d escr i beResul t ados( Map<St r i ng, I nt eger > cuent aPal abr as) {
Fi l eWr i t er f i l eWr i t er = nul l ;
Buf f er edWr i t er buf f er edWr i t er ;

/ / Abr e el ar chi vo donde se escr i bi r an l os r esul t ados
t r y {
f i l eWr i t er = new Fi l eWr i t er ( nomAr chi voSal i da) ;
} cat ch ( I OExcept i on i oe) {
Syst em. out . pr i nt l n( " Er r or , no se pudo cr ear el ar chi vo"
+ nomAr chi voSal i da) ;
r et ur n;
}

406 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono
/ / Se envuel ve el ar chi vo donde se escr i bi r an l os r esul t ados con un
/ / ar chi vo del t i po Buf f er edWr i t er par a ef i ci ent ar su acceso
buf f er edWr i t er = new Buf f er edWr i t er (
( Out put St r eamWr i t er ) ( f i l eWr i t er ) ) ;

t r y {
buf f er edWr i t er . wr i t e( " Fr ecuenci a de l as pal abr as r eser vadas" ) ;
buf f er edWr i t er . newLi ne( ) ;
buf f er edWr i t er . wr i t e( " en l a cl ase: " + nomAr chi voEnt r ada) ;
buf f er edWr i t er . newLi ne( ) ;
buf f er edWr i t er . newLi ne( ) ;

/ / Par a cada pal abr a r eser vada
f or ( Map. Ent r y<St r i ng, I nt eger > pal abr a :
cuent aPal abr as. ent r ySet ( ) ) {
/ / escr i be en el ar chi vo l a pal abr a r eser vada y su ocur r enci a
buf f er edWr i t er . wr i t e( pal abr a. get Key( ) + " : "
+ pal abr a. get Val ue( ) ) ;
/ / Escr i be en el ar chi vo un sal t o de l i nea
buf f er edWr i t er . newLi ne( ) ;
}

buf f er edWr i t er . cl ose( ) ;
f i l eWr i t er . cl ose( ) ;
} cat ch ( I OExcept i on i oe) {
Syst em. out . pr i nt l n( " Er r or al cer r ar el ar chi vo"
+ nomAr chi voSal i da) ;
}
}

/ **
* Est e met odo cuent a l as ocur r enci as de cada pal abr a cl ave y l as
* al macena en un mapa.
*
* @par amf uent e Cadena con el codi go f uent e del ar chi vo de ent r ada
* @par ampal abr as Ar r egl o con l as pal abr as r eser vadas
* @r et ur n Mapa con l as ocur r enci as de cada pal abr a r eser vada
*/
publ i c Map<St r i ng, I nt eger > pr ocesaAr chi vo( St r i ng f uent e,
St r i ng pal abr as[ ] ) {
Map<St r i ng, I nt eger > cuent aPal abr as = new Tr eeMap( ) ;
St r i ng pal abr a;
St r i ngBuf f er exReg = new St r i ngBuf f er ( ) ;

/ / Par a cada pal abr a r eser vada
f or ( i nt i = 0; i < pal abr as. l engt h; i ++) {
/ / Agr gal a a l a expr esi n r egul ar
exReg. append( " ( ?: " ) ;
exReg. append( " \ \ b" ) ;
Tema 11 Expresiones Regulares en Java 407
ITSON Manuel Domitsu Kono
exReg. append( pal abr as[ i ] ) ;
exReg. append( " \ \ b" ) ;
exReg. append( " ) " ) ;
i f ( i < pal abr as. l engt h - 1) {
exReg. append( " | " ) ;
}
}

/ / Compi l a l a expr essi on r egul ar en un pat r on
Pat t er n p = Pat t er n. compi l e( exReg. t oSt r i ng( ) , Pat t er n. MULTI LI NE) ;

/ / Cr ea un aj ust ador par a el t ext o del ar chi vo
Mat cher m= p. mat cher ( f uent e) ;

/ / Mi ent r as haya pal abr as r eser vadas en el codi go f uent e
whi l e ( m. f i nd( ) ) {
/ / Obt en l a pal abr a r eser vada encont r ada
pal abr a = m. gr oup( ) ;

/ / Si l a pal abr a r eser vada es nueva
i f ( ! cuent aPal abr as. cont ai nsKey( pal abr a) ) {
cuent aPal abr as. put ( pal abr a, 1) ;
} / / Si l a pal abr a r eser vada est a r epet i da
el se {
i nt n = cuent aPal abr as. get ( pal abr a) ;
cuent aPal abr as. put ( pal abr a, n + 1) ;
}
}

r et ur n cuent aPal abr as;
}
}

Para probar el cdigo de la clase anterior se tiene la siguiente clase de
prueba:

PruebaEstadisticas2.java
/ *
* PuebaEst adi st i cas2. j ava
*/
package est adi st i cas;

/ **
* Est a cl ase si r ve par a pr obar l a cl ase Est adi st i cas2 que l ee un ar chi vo
* t ext o que cont i ene el codi go f uent e de una cl ase de J ava y cuent a el
* numer o de veces que apar ecen l as pal abr as r eser vadas. Los r esul t ados
* l os al macena en ot r o ar chi vo t ext o.
*/
408 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono
publ i c cl ass PuebaEst adi st i cas2 {

/ **
* Met odo mai n( ) . I nvoca a l os met odos de l a cl ase Est adi st i cas2
* @par amar gs Ar gument os en l a l i nea de comando
*/
publ i c st at i c voi d mai n( St r i ng[ ] ar gs) {
PuebaEst adi st i cas2 puebaEst adi st i cas = new PuebaEst adi st i cas2( ) ;
St r i ng pal abr asReser vadas[ ] = {" i f " , " swi t ch" , " whi l e" , " f or " , " do" };

/ / Cr ea un obj et o del t i po Est adi st i cas2 y l e pasa l os nombr es de l os
/ / ar chi vos con el codi go f uent e, l os r esul t ados y l a l i st a de
/ / pal abr as r eser vadas a buscar
Est adi st i cas2 est adi st i cas =
new Est adi st i cas2( " sr c\ \ est adi st i cas\ \ Est adi st i cas2. j ava" ,
" est adi st i cas. t xt " , pal abr asReser vadas) ;
}
}

3. Otra de las aplicaciones de las expresiones regulares es la de validar las
entradas de un programa. Estas validaciones son importantes ya que una
entrada errnea puede hacer que el programa arroje resultados errneos.
La siguiente clase contiene algunas funciones que utilizan expresiones
regulares para probar si la cadena de su parmetro se ajusta a un tipo de
entrada particular.

Validadores.java
/ *
* Val i dador es. j ava
*
* Cr eat ed on 23 de abr i l de 2012, 03: 25 PM
*
* @aut hor mdomi t su
*/
package val i dor es;

i mpor t j ava. ut i l . r egex. Mat cher ;
i mpor t j ava. ut i l . r egex. Pat t er n;

/ **
* Est a cl ase pr ovee de met odos par a val i dar que l as cadenas de sus
* par met r os r epr esent an a dat os de l os t i pos especi f i cados por el
* met odo
*/
publ i c cl ass Val i dador es {

/ **
* Val i da si l a cadena s est vaci a.
*
* @par ams Cadena a ver i f i car
* @r et ur n t r ue si l a cadena es vaci a o nul a, f al se en caso cont r ar i o.
*/
Tema 11 Expresiones Regulares en Java 409
ITSON Manuel Domitsu Kono
publ i c bool ean cadenaVaci a( St r i ng s) {
Char Sequence cadena = s;

/ / Def i ne una expr esi n r egul ar par a una cadena vac a
St r i ng r eCadena = " ^\ \ s*$" ;

/ / Compi l a l a expr esi n r egul ar a un pat r n
Pat t er n pat t er n = Pat t er n. compi l e( r eCadena) ;

/ / Cr ea un compar ador par a compar ar l a cadena cont r a el pat r n
Mat cher mat cher = pat t er n. mat cher ( cadena) ;

/ / Si l a cadena se aj ust a al pat r n
i f ( mat cher . mat ches( ) ) {
r et ur n t r ue;
}

r et ur n f al se;
}

/ **
* Val i da si l a cadena s no excede l a l ongi t ud l ongMax
*
* @par aml ongMax Longi t ud mxi ma de l a cadena
* @par ams Cadena a ver i f i car
* @r et ur n t r ue si l a cadena no excede l a l ongi t ud l ongMax, f al se en
* caso cont r ar i o
*/
publ i c bool ean val i daCadena( i nt l ongMax, St r i ng s) {
Char Sequence cadena = s;

/ / Def i ne una expr esi n r egul ar par a una cadena de l ongi t ud mxi ma
/ / dada por el par met r o l ongMax
St r i ng r eCadena = " ^\ \ w{1, " + l ongMax + " }$" ;

/ / Compi l a l a expr esi n r egul ar a un pat r n
Pat t er n pat t er n = Pat t er n. compi l e( r eCadena) ;

/ / Cr ea un compar ador par a compar ar l a cadena cont r a el pat r n
Mat cher mat cher = pat t er n. mat cher ( cadena) ;

/ / Si l a cadena se aj ust a al pat r n
i f ( mat cher . mat ches( ) ) {
r et ur n t r ue;
}

r et ur n f al se;
}

/ **
* Val i da una cl ave. Una cl ave est a f or mada de 3 l et r as mayscul as
* y 4 di gi t os
*
* @par ams Cl ave a val i dar
* @r et ur n t r ue si es una cl ave val i da, f al se en caso cont r ar i o
*/
publ i c bool ean val i daCl ave( St r i ng s) {
410 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono
Char Sequence cadena = s. t r i m( ) ;

/ / Def i ne una expr esi n r egul ar par a una cl ave
St r i ng r eCadena = " ^[ A- Z] {3}[ 0- 9] {4}$" ;

/ / Compi l a l a expr esi n r egul ar a un pat r n
Pat t er n pat t er n = Pat t er n. compi l e( r eCadena) ;

/ / Cr ea un compar ador par a compar ar l a cadena cont r a el pat r n
Mat cher mat cher = pat t er n. mat cher ( cadena) ;

/ / Si l a cadena se aj ust a al pat r n
i f ( mat cher . mat ches( ) ) {
r et ur n t r ue;
}

r et ur n f al se;
}

/ **
* Val i da si l a cadena s sl o cont i ene di gi t os.
*
* @par ams Cadena a ver i f i car
* @r et ur n t r ue si l a cadena r epr esent a un ent er o, f al se en caso
* cont r ar i o.
*/
publ i c bool ean val i daEnt er o( St r i ng s) {
Char Sequence cadena = s. t r i m( ) ;

/ / Def i ne una expr esi n r egul ar par a una cadena con pur os di gi t os
St r i ng r eCadena = " ^\ \ d+$" ;

/ / Compi l a l a expr esi n r egul ar a un pat r n
Pat t er n pat t er n = Pat t er n. compi l e( r eCadena) ;

/ / Cr ea un compar ador par a compar ar l a cadena cont r a el pat r n
Mat cher mat cher = pat t er n. mat cher ( cadena) ;

/ / Si l a cadena se aj ust a al pat r n
i f ( mat cher . mat ches( ) ) {
r et ur n t r ue;
}

r et ur n f al se;
}

/ **
* Val i da si l a cadena s r epr esent a un ent er o posi t i vo de no ms de
* numDi gi t os de l ongi t ud.
*
* @par ams Cadena a ver i f i car
* @r et ur n t r ue si l a cadena r epr esent a un ent er o, f al se en caso
* cont r ar i o.
*/
publ i c bool ean val i daEnt er oMaxDi gi t os( i nt numDi gi t os, St r i ng s) {
Char Sequence cadena = s. t r i m( ) ;

Tema 11 Expresiones Regulares en Java 411
ITSON Manuel Domitsu Kono
/ / Def i ne una expr esi n r egul ar par a una cadena con cuando mucho
/ / numDi gi t os
St r i ng r eCadena = " ^\ \ d{1, " + numDi gi t os + " }$" ;

/ / Compi l a l a expr esi n r egul ar a un pat r n
Pat t er n pat t er n = Pat t er n. compi l e( r eCadena) ;

/ / Cr ea un compar ador par a compar ar l a cadena cont r a el pat r n
Mat cher mat cher = pat t er n. mat cher ( cadena) ;

/ / Si l a cadena se aj ust a al pat r n
i f ( mat cher . mat ches( ) ) {
r et ur n t r ue;
}

r et ur n f al se;
}

/ **
* Val i da un ent er o posi t i vo en el r ango [ mi n, max] .
*
* @par ammi n Li mi t e i nf er i or del ent er o
* @par ammax Li mi t e super i or del ent er o
* @par ams Cadena a ver i f i car
* @r et ur n t r ue si l a cadena r epr esent a un ent er o, f al se en caso
* cont r ar i o.
*/
publ i c bool ean val i daEnt er oRango( i nt mi n, i nt max, St r i ng s) {
/ / val i da que sol o t enga di gi t os
i f ( ! val i daEnt er o( s) ) {
r et ur n f al se;
}

/ / Convi er t e l a cadena a un ent er o
i nt n = I nt eger . par seI nt ( s) ;

/ / Si l a cadena no est en el r ango dado
i f ( n < mi n | | n > max) {
r et ur n f al se;
}

r et ur n t r ue;
}

/ **
* Val i da si l a cadena s r epr esent a una f echa en el f or mat o dd/ mm/ aaaa.
*
* @par ams Cadena a ver i f i car
* @r et ur n t r ue si l a cadena r epr esent a una f echa en el f or mat o
* dd/ mm/ aaaa,
* f al se en caso cont r ar i o.
*/
publ i c bool ean val i daFecha( St r i ng s) {
Char Sequence cadena = s. t r i m( ) ;

/ / Def i ne una expr esi n r egul ar par a una f echa
St r i ng r eCadena = " ^( ( [ 0- 2] ?\ \ d) | ( [ 3] [ 0- 1] ) ) \ \ / ( ( [ 0] ?\ \ d) | ( [ 1] [ 0-
412 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono
2] ) ) \ \ / ( \ \ d{4}) $" ;

/ / Compi l a l a expr esi n r egul ar a un pat r n
Pat t er n pat t er n = Pat t er n. compi l e( r eCadena) ;

/ / Cr ea un compar ador par a compar ar l a cadena cont r a el pat r n
Mat cher mat cher = pat t er n. mat cher ( cadena) ;

/ / Si l a cadena se aj ust a al pat r n
i f ( mat cher . mat ches( ) ) {
r et ur n t r ue;
}

r et ur n f al se;
}
}

Para probar los mtodos de validacin de la clase anterior se tiene la
siguiente clase de pruebas unitarias:

ValidadoresTest.java
/ *
* Val i dador esTest . j ava
*/
package val i dor es;

i mpor t or g. j uni t . Af t er Cl ass;
i mpor t st at i c or g. j uni t . Asser t . *;
i mpor t or g. j uni t . Bef or eCl ass;
i mpor t or g. j uni t . Test ;

/ **
* Est a es l a cl ase de pr ueba de l a cl ase Val i dador es. j ava
*
* @aut hor Manuel Domi t su
*/
publ i c cl ass Val i dador esTest {

publ i c Val i dador esTest ( ) {
}

@Bef or eCl ass
publ i c st at i c voi d set UpCl ass( ) t hr ows Except i on {
}

@Af t er Cl ass
publ i c st at i c voi d t ear DownCl ass( ) t hr ows Except i on {
}

/ **
* Pr ueba uni t ar i a del met odo cadenaVaci a de l a cl ase Val i dador es.
*/
@Test
publ i c voi d t est CadenaVaci a( ) {
Val i dador es i nst ance = new Val i dador es( ) ;
bool ean r esul t ;
Tema 11 Expresiones Regulares en Java 413
ITSON Manuel Domitsu Kono
St r i ng s;

Syst em. out . pr i nt l n( " Pr ueba uni t ar i a del met odo cadenaVaci a" ) ;

/ / Pr ueba si acept a una cadena vaci a
s = " " ;
r esul t = i nst ance. cadenaVaci a( s) ;
asser t Tr ue( r esul t ) ;

/ / Pr ueba si acept a una cadena con espaci os
s = " " ;
r esul t = i nst ance. cadenaVaci a( s) ;
asser t Tr ue( r esul t ) ;

/ / Pr ueba si acept a una cadena con car act er t abul ador
s = " \ t " ;
r esul t = i nst ance. cadenaVaci a( s) ;
asser t Tr ue( r esul t ) ;

/ / Pr ueba si acept a una cadena con car act er t abul ador
s = " \ n" ;
r esul t = i nst ance. cadenaVaci a( s) ;
asser t Tr ue( r esul t ) ;

/ / Pr ueba si r echaza una cadena no vaci a
s = " no\ nno" ;
r esul t = i nst ance. cadenaVaci a( s) ;
asser t Fal se( r esul t ) ;
}

/ **
* Pr ueba uni t ar i a del met odo val i daCadena de l a cl ase Val i dador es.
*/
@Test
publ i c voi d t est Val i daCadena( ) {
Val i dador es i nst ance = new Val i dador es( ) ;
bool ean r esul t ;
St r i ng s;
i nt l ongMax;

Syst em. out . pr i nt l n( " Pr ueba uni t ar i a del met odo val i daCadena" ) ;

/ / Pr ueba si acept a una cadena de l ongi t ud i gual a l ongMax
l ongMax = 5;
s = " 12345" ;
r esul t = i nst ance. val i daCadena( l ongMax, s) ;
asser t Tr ue( r esul t ) ;

/ / Pr ueba si acept a una cadena de l ongi t ud menor a l ongMax
l ongMax = 5;
s = " 123" ;
r esul t = i nst ance. val i daCadena( l ongMax, s) ;
asser t Tr ue( r esul t ) ;

/ / Pr ueba si r echaza una cadena de l ongi t ud mayor a l ongMax
l ongMax = 5;
s = " 1234567" ;
414 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono
r esul t = i nst ance. val i daCadena( l ongMax, s) ;
asser t Fal se( r esul t ) ;

/ / Pr ueba si r echaza una cadena vaci a
l ongMax = 5;
s = " " ;
r esul t = i nst ance. val i daCadena( l ongMax, s) ;
asser t Fal se( r esul t ) ;
}

/ **
* Pr ueba uni t ar i a del met odo val i daCl ave de l a cl ase Val i dador es.
*/
@Test
publ i c voi d t est Val i daCl ave( ) {
Val i dador es i nst ance = new Val i dador es( ) ;
bool ean r esul t ;
St r i ng s;

Syst em. out . pr i nt l n( " Pr ueba uni t ar i a del met odo val i daCl ave" ) ;

/ / Pr ueba si acept a una cl ave val i da
s = " ABC0123" ;
r esul t = i nst ance. val i daCl ave( s) ;
asser t Tr ue( r esul t ) ;

/ / Pr ueba si r echaza una cl ave con mi nuscul as
s = " abc0123" ;
r esul t = i nst ance. val i daCl ave( s) ;
asser t Fal se( r esul t ) ;

/ / Pr ueba si r echaza una cl ave con ot r os car act er es
s = " AB+; 0123" ;
r esul t = i nst ance. val i daCl ave( s) ;
asser t Fal se( r esul t ) ;

/ / Pr ueba si r echaza una cl ave vaci a
s = " " ;
r esul t = i nst ance. val i daCl ave( s) ;
asser t Fal se( r esul t ) ;

/ / Pr ueba si r echaza una cl ave con espaci os
s = " " ;
r esul t = i nst ance. val i daCl ave( s) ;
asser t Fal se( r esul t ) ;

/ / Pr ueba si r echaza una cl ave con sol o car act er es
s = " ABC" ;
r esul t = i nst ance. val i daCl ave( s) ;
asser t Fal se( r esul t ) ;

/ / Pr ueba si r echaza una cl ave con sol o di gi t os
s = " 0123" ;
r esul t = i nst ance. val i daCl ave( s) ;
asser t Fal se( r esul t ) ;

/ / Pr ueba si r echaza una cl ave con mas car act er es
Tema 11 Expresiones Regulares en Java 415
ITSON Manuel Domitsu Kono
s = " ABCD0123" ;
r esul t = i nst ance. val i daCl ave( s) ;
asser t Fal se( r esul t ) ;

/ / Pr ueba si r echaza una cl ave con menos car act er es
s = " AB0123" ;
r esul t = i nst ance. val i daCl ave( s) ;
asser t Fal se( r esul t ) ;

/ / Pr ueba si r echaza una cl ave con mas di gi t os
s = " ABC01234" ;
r esul t = i nst ance. val i daCl ave( s) ;
asser t Fal se( r esul t ) ;

/ / Pr ueba si r echaza una cl ave con menos di gi t os
s = " ABC012" ;
r esul t = i nst ance. val i daCl ave( s) ;
asser t Fal se( r esul t ) ;
}

/ **
* Pr ueba uni t ar i a del met odo val i daEnt er o de l a cl ase Val i dador es.
*/
@Test
publ i c voi d t est Val i daEnt er o( ) {
Val i dador es i nst ance = new Val i dador es( ) ;
bool ean r esul t ;
St r i ng s;

Syst em. out . pr i nt l n( " Pr ueba uni t ar i a del met odo val i daEnt er o" ) ;

/ / Pr ueba si acept a un ent er o val i do
s = " 1234" ;
r esul t = i nst ance. val i daEnt er o( s) ;
asser t Tr ue( r esul t ) ;

/ / Pr ueba si r echaza una cadena con l et r as
s = " 12a3" ;
r esul t = i nst ance. val i daEnt er o( s) ;
asser t Fal se( r esul t ) ;


/ / Pr ueba si r echaza una cadena con ot r os car act er es
s = " A12+; 0" ;
r esul t = i nst ance. val i daEnt er o( s) ;
asser t Fal se( r esul t ) ;

/ / Pr ueba si r echaza una cadena vaci a
s = " " ;
r esul t = i nst ance. val i daEnt er o( s) ;
asser t Fal se( r esul t ) ;

/ / Pr ueba si r echaza una cadena con espaci osa
s = " " ;
r esul t = i nst ance. val i daEnt er o( s) ;
asser t Fal se( r esul t ) ;
}
416 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono

/ **
* Pr ueba uni t ar i a del met odo val i daEnt er oMaxDi gi t os de l a cl ase
Val i dador es.
*/
@Test
publ i c voi d t est Val i daEnt er oMaxDi gi t os( ) {
Val i dador es i nst ance = new Val i dador es( ) ;
bool ean r esul t ;
St r i ng s;
i nt numDi gi t os;

Syst em. out . pr i nt l n(
" Pr ueba uni t ar i a del met odo val i daEnt er oMaxDi gi t os" ) ;

/ / Pr ueba si acept a un ent er o val i do
numDi gi t os = 1;
s = " 1" ;
r esul t = i nst ance. val i daEnt er oMaxDi gi t os( numDi gi t os, s) ;
asser t Tr ue( r esul t ) ;

/ / Pr ueba si acept a un ent er o val i do
numDi gi t os = 5;
s = " 12345" ;
r esul t = i nst ance. val i daEnt er oMaxDi gi t os( numDi gi t os, s) ;
asser t Tr ue( r esul t ) ;

/ / Pr ueba si acept a un ent er o val i do
numDi gi t os = 5;
s = " 1234" ;
r esul t = i nst ance. val i daEnt er oMaxDi gi t os( numDi gi t os, s) ;
asser t Tr ue( r esul t ) ;

/ / Pr ueba si r echaza un ent er o muy l ar go
numDi gi t os = 5;
s = " 124567" ;
r esul t = i nst ance. val i daEnt er oMaxDi gi t os( numDi gi t os, s) ;
asser t Fal se( r esul t ) ;

/ / Pr ueba si r echaza un ent er o con l et r as
numDi gi t os = 5;
s = " 12a3" ;
r esul t = i nst ance. val i daEnt er oMaxDi gi t os( numDi gi t os, s) ;
asser t Fal se( r esul t ) ;

/ / Pr ueba si r echaza una cadena con ot r os car act er es
numDi gi t os = 5;
s = " A12+; 0" ;
r esul t = i nst ance. val i daEnt er oMaxDi gi t os( numDi gi t os, s) ;
asser t Fal se( r esul t ) ;

/ / Pr ueba si r echaza una cadena vaci a
numDi gi t os = 5;
s = " " ;
r esul t = i nst ance. val i daEnt er oMaxDi gi t os( numDi gi t os, s) ;
asser t Fal se( r esul t ) ;

Tema 11 Expresiones Regulares en Java 417
ITSON Manuel Domitsu Kono
/ / Pr ueba si r echaza una cadena con espaci osa
numDi gi t os = 5;
s = " " ;
r esul t = i nst ance. val i daEnt er oMaxDi gi t os( numDi gi t os, s) ;
asser t Fal se( r esul t ) ;
}

/ **
* Pr ueba uni t ar i a del met odo val i daEnt er oRango de l a cl ase
* Val i dador es.
*/
@Test
publ i c voi d t est Val i daEnt er oRango( ) {
Val i dador es i nst ance = new Val i dador es( ) ;
bool ean r esul t ;
St r i ng s;
i nt mi n, max;

Syst em. out . pr i nt l n( " Pr ueba uni t ar i a del met odo val i daEnt er oRango" ) ;

mi n = 10;
max = 100;

/ / Pr ueba si acept a un ent er o con r ango val i do
s = " 50" ;
r esul t = i nst ance. val i daEnt er oRango( mi n, max, s) ;
asser t Tr ue( r esul t ) ;

/ / Pr ueba si acept a un ent er o con r ango val i do
s = " 10" ;
r esul t = i nst ance. val i daEnt er oRango( mi n, max, s) ;
asser t Tr ue( r esul t ) ;

/ / Pr ueba si acept a un ent er o con r ango val i do
s = " 100" ;
r esul t = i nst ance. val i daEnt er oRango( mi n, max, s) ;
asser t Tr ue( r esul t ) ;

/ / Pr ueba si r echaza un ent er o con por debaj o del r ango
s = " 5" ;
r esul t = i nst ance. val i daEnt er oRango( mi n, max, s) ;
asser t Fal se( r esul t ) ;

/ / Pr ueba si r echaza un ent er o con por enci ma del r ango
s = " 500" ;
r esul t = i nst ance. val i daEnt er oRango( mi n, max, s) ;
asser t Fal se( r esul t ) ;
}

/ **
* Pr ueba uni t ar i a del met odo val i daFecha de l a cl ase Val i dador es.
*/
@Test
publ i c voi d t est Val i daFecha( ) {
Val i dador es i nst ance = new Val i dador es( ) ;
bool ean r esul t ;
St r i ng s;
418 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono

Syst em. out . pr i nt l n( " Pr ueba uni t ar i a del met odo val i daFecha" ) ;

/ / Pr ueba si acept a una f echa val i da
s = " 1/ 1/ 2001" ;
r esul t = i nst ance. val i daFecha( s) ;
asser t Tr ue( r esul t ) ;

/ / Pr ueba si acept a una f echa val i da
s = " 01/ 01/ 2010" ;
r esul t = i nst ance. val i daFecha( s) ;
asser t Tr ue( r esul t ) ;

/ / Pr ueba si acept a una f echa val i da
s = " 15/ 12/ 2001" ;
r esul t = i nst ance. val i daFecha( s) ;
asser t Tr ue( r esul t ) ;

/ / Pr ueba si acept a una f echa val i da
s = " 21/ 08/ 2000" ;
r esul t = i nst ance. val i daFecha( s) ;
asser t Tr ue( r esul t ) ;

/ / Pr ueba si acept a una f echa val i da
s = " 31/ 1/ 2001" ;
r esul t = i nst ance. val i daFecha( s) ;
asser t Tr ue( r esul t ) ;

/ / Pr ueba si r echaza una f echa i nval i da
s = " 11/ 2001" ;
r esul t = i nst ance. val i daFecha( s) ;
asser t Fal se( r esul t ) ;

/ / Pr ueba si r echaza una f echa i nval i da
s = " 51/ 13/ 2001" ;
r esul t = i nst ance. val i daFecha( s) ;
asser t Fal se( r esul t ) ;

/ / Pr ueba si r echaza una f echa val i da
s = " 0/ 0/ 201" ;
r esul t = i nst ance. val i daFecha( s) ;
asser t Fal se( r esul t ) ;

/ / Pr ueba si r echaza una f echa val i da
s = " 12/ ago/ 2001" ;
r esul t = i nst ance. val i daFecha( s) ;
asser t Fal se( r esul t ) ;
}
}


El siguiente cdigo ilustra el uso de los validadores anteriores. Es el cdigo
parcial de un cuadro de dilogo empleado para capturar los datos de una
cancin del programa del amante a la msica. Cada campo se valida en
forma individual cuando el usuario pasa al siguiente campo y al final cuando
Tema 11 Expresiones Regulares en Java 419
ITSON Manuel Domitsu Kono
el usuario hace clic en el botn Aceptar. Para validar un campo de texto se
usa un mtodo oyente del tipo Act i onPer f or med para ese campo de
texto.

DlgCancion.java
/ *
* Dl gCanci on. j ava
*/
package i nt er f azUsuar i o;

i mpor t j ava. awt . Di mensi on;
i mpor t j ava. awt . Poi nt ;
i mpor t j avax. swi ng. Def aul t ComboBoxModel ;
i mpor t j avax. swi ng. J Opt i onPane;
i mpor t obj et osNegoci o. Canci on;
i mpor t obj et osNegoci o. Gener o;
i mpor t obj et osSer vi ci o. Fecha;
i mpor t val i dor es. Val i dador es;

/ **
* est e cuadr o de di al ogo capt ur a l os dat os de una canci on del pr ogr ama
* del amant e a l a musi ca y l os r egr esa en el par amet r o canci on
*
* @aut hor Manuel Domi t su
*/
publ i c cl ass Dl gCanci on ext ends j avax. swi ng. J Di al og {
. . .

/ **
* Mt odo oyent e del bot n bot onAcept ar . Val i da l os campos de
* ent r ada. Si no hubo er r or es l l ena un obj et o de t i po canci on con
* l os val or es capt ur ados. En caso cont r ar i o despl i ega un mensaj e con
* l os er r or es det ect ados y l uego ci er r a el cuadr o de di al ogo.
*
* @par amevt Event o al que escucha
*/
pr i vat e voi d bot onAcept ar Act i onPer f or med( j ava. awt . event . Act i onEvent
evt ) {
St r i ngBuf f er msj Er r or = new St r i ngBuf f er ( ) ;
St r i ng t i t ul o;
St r i ng i nt er pr et e;
St r i ng aut or ;
St r i ng al bum;
St r i ng sDur aci on;
St r i ng sFecha;
i nt posEr r or = 0;

/ / Si l a oper aci n es Agr egar o Act ual i zar
420 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono
i f ( ( oper aci on == Const ant esGUI . AGREGAR)
| | ( oper aci on == Const ant esGUI . ACTUALI ZAR) ) {
/ / Obt i ene l os val or es de l os campos de t ext o
t i t ul o = campoText oTi t ul o. get Text ( ) ;
i nt er pr et e = campoText oI nt er pr et e. get Text ( ) ;
aut or = campoText oAut or . get Text ( ) ;
al bum= campoText oAl bum. get Text ( ) ;
sDur aci on = campoText oDur aci on. get Text ( ) ;
sFecha = campoText oFecha. get Text ( ) ;

/ / Si no hay t i t ul o
i f ( val i dador es. cadenaVaci a( t i t ul o) ) {
/ / Agr ega mensaj e de er r or
msj Er r or . append( " Fal t el t t ul o. " ) ;
/ / Est abl ece l a posi ci on del pr i mer er r or
posEr r or = 1;
} / / Si el t i t ul o es muy l ar go
el se i f ( ! val i dador es. val i daCadena( 35, t i t ul o) ) {
/ / Agr ega mensaj e de er r or
msj Er r or . append( " T t ul o muy l ar go. " ) ;
/ / Est abl ece l a posi ci on del pr i mer er r or
posEr r or = 1;
}

/ / Si no hay i nt er pr et e
i f ( val i dador es. cadenaVaci a( i nt er pr et e) ) {
/ / Agr ega mensaj e de er r or
msj Er r or . append( " Fal t el i nt r pr et e. " ) ;
/ / Est abl ece l a posi ci on del pr i mer er r or
i f ( posEr r or == 0) {
posEr r or = 2;
}
} / / Si el i nt er pr et e es muy l ar go
el se i f ( ! val i dador es. val i daCadena( 35, i nt er pr et e) ) {
/ / Agr ega mensaj e de er r or
msj Er r or . append( " I nt r pr et e muy l ar go. " ) ;
/ / Est abl ece l a posi ci on del pr i mer er r or
i f ( posEr r or == 0) {
posEr r or = 2;
}
}

/ / Si hay aut or y es muy l ar go
i f ( ! val i dador es. cadenaVaci a( aut or )
&& ! val i dador es. val i daCadena( 35, aut or ) ) {
/ / Agr ega mensaj e de er r or
msj Er r or . append( " Aut or muy l ar go. " ) ;
/ / Est abl ece l a posi ci on del pr i mer er r or
i f ( posEr r or == 0) {
Tema 11 Expresiones Regulares en Java 421
ITSON Manuel Domitsu Kono
posEr r or = 3;
}
}

/ / Si hay al bumy es muy l ar go
i f ( ! val i dador es. cadenaVaci a( al bum)
&& ! val i dador es. val i daCadena( 35, al bum) ) {
/ / Agr ega mensaj e de er r or
msj Er r or . append( " Al bummuy l ar go. " ) ;
/ / Est abl ece l a posi ci on del pr i mer er r or
i f ( posEr r or == 0) {
posEr r or = 4;
}
}

/ / Si hay dur aci on y es muy l ar ga
i f ( ! val i dador es. cadenaVaci a( sDur aci on)
&& ! val i dador es. val i daEnt er oMaxDi gi t os( 3, sDur aci on) ) {
/ / Agr ega mensaj e de er r or
msj Er r or . append( " Ent er o muy l ar go. " ) ;
/ / Est abl ece l a posi ci on del pr i mer er r or
i f ( posEr r or == 0) {
posEr r or = 5;
}
}

/ / Si hay f echa y es i nval i da
i f ( ! val i dador es. cadenaVaci a( sFecha)
&& ! val i dador es. val i daFecha( sFecha) ) {
/ / Agr ega mensaj e de er r or
msj Er r or . append( " Fecha i nvl i da. " ) ;
/ / Est abl ece l a posi ci on del pr i mer er r or
i f ( posEr r or == 0) {
posEr r or = 6;
}
}

/ / Si hubo al menos un er r or despl i ega sus mensaj es
i f ( posEr r or > 0) {
J Opt i onPane. showMessageDi al og( t hi s, msj Er r or ,
" Er r or de ent r ada. " ,
J Opt i onPane. ERROR_MESSAGE) ;

/ / Has que el campo de t ext o con el pr i mer er r or obt enga el
/ / f oco
swi t ch ( posEr r or ) {
case 1:
campoText oTi t ul o. r equest Focus( ) ;
br eak;
422 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono
case 2:
campoText oI nt er pr et e. r equest Focus( ) ;
br eak;
case 3:
campoText oAut or . r equest Focus( ) ;
br eak;
case 4:
campoText oAl bum. r equest Focus( ) ;
br eak;
case 5:
campoText oDur aci on. r equest Focus( ) ;
br eak;
case 6:
campoText oFecha. r equest Focus( ) ;
br eak;
}
r et ur n;
}

/ / Toma l os val or es capt ur ados en l os campos de t ext o y en l a
/ / caj a combi nada y al macnal os en el par met r o canci on.
canci on. set Ti t ul o( t i t ul o) ;
canci on. set I nt er pr et e( i nt er pr et e) ;
canci on. set Aut or ( aut or ) ;
canci on. set Gener o( ( Gener o)
caj aCombi nadaGener osCanci ones. get Sel ect edI t em( ) ) ;
canci on. set Al bum( al bum) ;
canci on. set Dur aci on( I nt eger . par seI nt ( sDur aci on) ) ;
canci on. set Fecha( new Fecha( sFecha) ) ;
}

/ / Bor r a el cont eni do de r espuest a
r espuest a. del et e( 0, r espuest a. l engt h( ) ) ;

/ / Est abl ece que se pr esi on el bot n bot onAcept ar
r espuest a. append( Const ant esGUI . ACEPTAR) ;

/ / Dest r uye el cuadr o de d al ogo
di spose( ) ;
}

/ **
* Mt odo oyent e del bot n bot onRest aur ar . Rest aur a l os val or es de
* l os campos de ent r ada y caj a combi nada a sus val or es or i gi nal es.
*
* @par amevt Event o al que escucha
*/
pr i vat e voi d bot onRest aur ar Act i onPer f or med( j ava. awt . event . Act i onEvent
evt ) {
Tema 11 Expresiones Regulares en Java 423
ITSON Manuel Domitsu Kono
/ / Rest aur a el cont eni do de l os campos de t ext o a su val or or i gi nal
/ / Si l a oper aci n es Agr egar
i f ( oper aci on == Const ant esGUI . AGREGAR) {
campoText oTi t ul o. set Text ( " " ) ;
campoText oI nt er pr et e. set Text ( " " ) ;
campoText oAut or . set Text ( " " ) ;
caj aCombi nadaGener osCanci ones. set Sel ect edI ndex( 0) ;
campoText oAl bum. set Text ( " " ) ;
campoText oDur aci on. set Text ( " " ) ;
campoText oFecha. set Text ( " " ) ;
}

/ / Si l a oper aci n es Act ual i zar
i f ( oper aci on == Const ant esGUI . ACTUALI ZAR) {
campoText oTi t ul o. set Text ( canci on. get Ti t ul o( ) ) ;
campoText oI nt er pr et e. set Text ( canci on. get I nt er pr et e( ) ) ;
campoText oAut or . set Text ( canci on. get Aut or ( ) ) ;
caj aCombi nadaGener osCanci ones
. set Sel ect edI t em( canci on. get Gener o( ) ) ;
campoText oAl bum. set Text ( canci on. get Al bum( ) ) ;
campoText oDur aci on. set Text ( new I nt eger ( canci on. get Dur aci on( ) )
. t oSt r i ng( ) ) ;
campoText oFecha. set Text ( canci on. get Fecha( ) . t oSt r i ng( ) ) ;
}
}

/ **
* Mt odo oyent e del bot n bot onCancel ar . ci er r a el cuadr o de
** di al ogo.
*
* @par amevt Event o al que escucha
*/
pr i vat e voi d bot onCancel ar Act i onPer f or med( j ava. awt . event . Act i onEvent
evt ) {
/ / Dest r uye el cuadr o de d al ogo
di spose( ) ;
}

/ **
* Met odo oyent e del campo de t ext o del t i t ul o. Val i da el t i t ul o.
* Debe haber un t i t ul o y no debe exceder a l os 35 car act er es Si hubo
* er r or es despl i ega un mensaj e de er r or
*
* @par amevt Event o al que escucha
*/
pr i vat e voi d
campoText oTi t ul oAct i onPer f or med( j ava. awt . event . Act i onEvent evt ) {
St r i ng t i t ul o = campoText oTi t ul o. get Text ( ) ;
St r i ng msj Er r or = " " ;
424 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono

/ / Si no hay t i t ul o
i f ( val i dador es. cadenaVaci a( t i t ul o) ) {
/ / cr ea el mensaj e de er r or
msj Er r or = " Fal t el t t ul o" ;
} / / Si el t i t ul o es muy l ar go
el se i f ( ! val i dador es. val i daCadena( 35, t i t ul o) ) {
/ / cr ea el mensaj e de er r or
msj Er r or = " T t ul o muy l ar go" ;
}

/ / Si hay un mensaj e de er r or
i f ( ! msj Er r or . equal s( " " ) ) {
/ / Despl i ega el mensaj e de er r or
J Opt i onPane. showMessageDi al og( t hi s, msj Er r or ,
" Er r or de ent r ada. " ,
J Opt i onPane. ERROR_MESSAGE) ;
/ / Has que est e campo de t ext o obt enga el f oco
campoText oTi t ul o. r equest Focus( ) ;
} el se {
/ / Has que l a si gui ent e component e obt enga el f oco
campoText oI nt er pr et e. r equest Focus( ) ;
}
}

/ **
* Met odo oyent e del campo de t ext o del i nt er pr et e. Val i da el
* i nt er pr et e. Debe haber un i nt er pr et e y no debe exceder a l os 35
* car act er es Si hubo er r or es despl i ega un mensaj e de er r or
*
* @par amevt Event o al que escucha
*/
pr i vat e voi d
campoText oI nt er pr et eAct i onPer f or med( j ava. awt . event . Act i onEvent evt ) {
St r i ng i nt er pr et e = campoText oI nt er pr et e. get Text ( ) ;
St r i ng msj Er r or = " " ;

/ / Si no hay i nt er pr et e
i f ( val i dador es. cadenaVaci a( i nt er pr et e) ) {
/ / cr ea el mensaj e de er r or
msj Er r or = " Fal t el i nt r pr et e" ;
} / / Si el i nt er pr et e es muy l ar go
el se i f ( ! val i dador es. val i daCadena( 35, i nt er pr et e) ) {
/ / cr ea el mensaj e de er r or
msj Er r or = " I nt r pr et e muy l ar go" ;
}

/ / Si hay un mensaj e de er r or
i f ( ! msj Er r or . equal s( " " ) ) {
Tema 11 Expresiones Regulares en Java 425
ITSON Manuel Domitsu Kono
/ / Despl i ega el mensaj e de er r or
J Opt i onPane. showMessageDi al og( t hi s, msj Er r or ,
" Er r or de ent r ada. " ,
J Opt i onPane. ERROR_MESSAGE) ;
/ / Has que est e campo de t ext o obt enga el f oco
campoText oI nt er pr et e. r equest Focus( ) ;
} el se {
/ / Has que l a si gui ent e component e obt enga el f oco
campoText oAut or . r equest Focus( ) ;
}
}

/ **
* Met odo oyent e del campo de t ext o del aut or . Val i da el aut or . Si
* hay un aut or , no debe exceder a l os 35 car act er es Si hubo er r or es
* despl i ega un mensaj e de er r or
*
* @par amevt Event o al que escucha
*/
pr i vat e voi d
campoText oAut or Act i onPer f or med( j ava. awt . event . Act i onEvent evt ) {
St r i ng aut or = campoText oAut or . get Text ( ) ;

/ / Si hay un aut or y es muy l ar go
i f ( ! val i dador es. cadenaVaci a( aut or )
&& ! val i dador es. val i daCadena( 5, aut or ) ) {
/ / Despl i ega el mensaj e de er r or
J Opt i onPane. showMessageDi al og( t hi s, " Aut or muy l ar go" ,
" Er r or de ent r ada. " ,
J Opt i onPane. ERROR_MESSAGE) ;
/ / Has que est e campo de t ext o obt enga el f oco
campoText oAut or . r equest Focus( ) ;
} el se {
/ / Has que l a si gui ent e component e obt enga el f oco
caj aCombi nadaGener osCanci ones. r equest Focus( ) ;
}
}

/ **
* Met odo oyent e de l a caj a combi nada del gener o. Pasa el f oco al
* si gui ent e campo de t ext o
*
* @par amevt Event o al que escucha
*/
pr i vat e voi d
caj aCombi nadaGener osCanci onesAct i onPer f or med( j ava. awt . event . Act i onEvent
evt ) {
/ / Has que l a si gui ent e component e obt enga el f oco
campoText oAl bum. r equest Focus( ) ;
426 Expresiones Regulares en Java
ITSON Manuel Domitsu Kono
}

/ **
* Met odo oyent e del campo de t ext o del al bum. Val i da el al bum. Si
* hay un al bum, no debe exceder a l os 35 car act er es Si hubo er r or es
* despl i ega un mensaj e de er r or
*
* @par amevt Event o al que escucha
*/
pr i vat e voi d
campoText oAl bumAct i onPer f or med( j ava. awt . event . Act i onEvent evt ) {
St r i ng al bum= campoText oAl bum. get Text ( ) ;

/ / Si hay un al bumy es muy l ar go
i f ( ! val i dador es. cadenaVaci a( al bum)
&& ! val i dador es. val i daCadena( 5, al bum) ) {
J Opt i onPane. showMessageDi al og( t hi s, " Al bummuy l ar go" ,
" Er r or de ent r ada. " ,
J Opt i onPane. ERROR_MESSAGE) ;
/ / Has que est e campo de t ext o obt enga el f oco
campoText oAl bum. r equest Focus( ) ;
} el se {
/ / Has que l a si gui ent e component e obt enga el f oco
campoText oDur aci on. r equest Focus( ) ;
}
}

/ **
* Met odo oyent e del campo de t ext o de l a dur aci on. Val i da l a
* dur aci on. Si exi st e no debe exceder a l os t r es di gi t os. Si hubo
* er r or es despl i ega un mensaj e de er r or
*
* @par amevt Event o al que escucha
*/
pr i vat e voi d
campoText oDur aci onAct i onPer f or med( j ava. awt . event . Act i onEvent evt ) {
St r i ng sDur aci on = campoText oDur aci on. get Text ( ) ;

/ / Si hay una dur aci on y es muy l ar ga
i f ( ! val i dador es. cadenaVaci a( sDur aci on)
&& ! val i dador es. val i daEnt er oMaxDi gi t os( 3, sDur aci on) ) {
/ / Despl i ega el mensaj e de er r or
J Opt i onPane. showMessageDi al og( t hi s, " Ent er o muy l ar go" ,
" Er r or de ent r ada. " ,
J Opt i onPane. ERROR_MESSAGE) ;
/ / Has que est e campo de t ext o obt enga el f oco
campoText oDur aci on. r equest Focus( ) ;
} el se {
/ / Has que l a si gui ent e component e obt enga el f oco
Tema 11 Expresiones Regulares en Java 427
ITSON Manuel Domitsu Kono
campoText oFecha. r equest Focus( ) ;
}
}

/ **
* Met odo oyent e del campo de t ext o de l A f echa. Val i da l a f echa.
* Debe est ar en el f or mat o dd/ mm/ aaaa. Si hubo er r or es despl i ega un
* mensaj e de er r or
* @par amevt Event o al que escucha
*/
pr i vat e voi d
campoText oFechaAct i onPer f or med( j ava. awt . event . Act i onEvent evt ) {
St r i ng sFecha = campoText oFecha. get Text ( ) ;

/ / Si hay una f echa y es i nval i da
i f ( ! val i dador es. cadenaVaci a( sFecha)
&& ! val i dador es. val i daFecha( sFecha) ) {
/ / Despl i ega el mensaj e de er r or
J Opt i onPane. showMessageDi al og( t hi s, " Fecha i nvl i da" ,
" Er r or de ent r ada. " ,
J Opt i onPane. ERROR_MESSAGE) ;
/ / Has que est e campo de t ext o obt enga el f oco
campoText oFecha. r equest Focus( ) ;
}
}

. . .

pr i vat e Canci on canci on;
pr i vat e Def aul t ComboBoxModel l i st aGener osCanci ones;
pr i vat e i nt oper aci on;
pr i vat e St r i ngBuf f er r espuest a;
pr i vat e Val i dador es val i dador es = new Val i dador es( ) ;
}

También podría gustarte