Unidad 2 Lenguajes y Automatas
Unidad 2 Lenguajes y Automatas
Unidad 2 Lenguajes y Automatas
ER primitivas: , , {a | a }
Ejemplos de usos.
2.2. Operaciones
Unin o Alternativa: Consideremos dos lenguajes
diferentes definidos sobre el mismo alfabeto L1 W()
y L2 W(). Se denomina unin de ambos lenguajes
al lenguaje formado por las palabras de ambos
lenguajes:
L1 U L2={ x | x L1 x L2}
L+=ULi
i=1
Lenguaje obtenido uniendo el lenguaje con todas sus
potencias posibles excepto L. Si L no contiene la
palabra vaca, la clausura positiva tampoco
Cierre o Clausura de un lenguaje: Se define el cierre o
clausura de un lenguaje L como :
L*=ULi=0
Operaciones
L1 U L2={ x | x L1 x L2}
L+=ULi
i=1
Lenguaje obtenido uniendo el lenguaje con todas sus potencias posibles excepto L. Si
L no contiene la palabra vaca, la clausura positiva tampoco
Cierre o Clausura de un lenguaje: Se define el cierre o clausura de un lenguaje L
como :
L* = U Li
i=0
Lenguaje obtenido uniendo el lenguaje con todas sus potencias posibles, incluso L.
Todas las clausuras contienen la palabra vaca.
Existen tres operaciones bsicas que se pueden realizar sobre las ER:
(F|M)
Descripcin
Representacin simple d
gnero.
[1-9][0-9]{2,2}-[1-9][0-9]{2,2}-[0-9]{4,4}
\+1 (425|206)-[1-9][0-9]{2,2}-[0-9]{4,4}
Notacin internacional pa
nmero de telfono de la
de Seattle.
[1-9][0-9]{4}-[0-9]{4}
[a-z]{5,8}@(hotmail\.com|msn\.com|[a-z]{3,8}\.(com|net|org))
Nmero de tarjeta de cr
Una vez tenemos esto, llega el momento de ver las funciones que se
usan para encajar expresiones regulares. Bsicamente tendremos dos
funciones para poder hacer esto:
Funcin matches(): esta funcin es parte del objeto Matcher. Intenta
encajar la expresin regular en la cadena de forma absoluta. En otras
palabras, en caso de que nuestroPatternno tuviera los smbolos ^ y $,
iba a actuar como si los tuviera. Devuelve un boolean. Veamos un
ejemplo:
1 Pattern regex = Pattern.compile("(\w+)@(\w+)\.([a-zA-z]{2,6})");
2 Matcher matcher = regex.matcher("[email protected]");
3
4
System.out.println(matcher.matches());
// output: true
5
6 Pattern regex = Pattern.compile("(\w+)@(\w+)\.([a-zA-z]{2,6})");
Matcher matcher = regex.matcher("basura
[email protected] basura");
8 System.out.println(matcher.matches());
7
9
// output: false
Funcin find(): esta funcin es tambin parte del objeto Matcher. Intenta
encajar la expresin regular en alguna parte de la cadena. Al contrario
que matches(), si el Pattern no contiene los smbolos de inicio y final, no
los inserta. Devuelve un boolean tambin. Cuando utilizamos esta
funcin, el objeto de la clase Matcher guarda la posicin en la que
consigui encajar el patrn, de forma que podremos usar las
funciones start(), end() ygroup()para acceder a la posicin inicial donde
encaj, la posicin final y la cadena que encaj, respectivamente.
Veamos el ejemplo anterior con esta funcin:
1 Pattern regex = Pattern.compile("(\w+)");
2 Matcher matcher = regex.matcher("[email protected]");
3
4
5
6
7
8
9
while(matcher.find())
System.out.println(matcher.group());
/* output:
test
vidasconcurrentes
com
*/
10
11 Pattern regex = Pattern.compile("(\w+)@(\w+)\.([a-zA-z]{2,6})");
12 Matcher matcher = regex.matcher("[email protected]");
13
14
System.out.println(matcher.find());
// output: true
15
16 Pattern regex = Pattern.compile("(\w+)@(\w+)\.([a-zA-z]{2,6})");
Matcher matcher = regex.matcher("basura
[email protected] basura");
18 System.out.println(matcher.find());
17
19
// output: true
Existe una forma rpida de ejecutar estas lneas en una sola, de forma
que compilamos unPattern y sobre l aplicamos la
funcin matches() directamente sin crear el objeto. Esta forma es
relativamente buena si, primero no vamos a querer reutilizar la
expresin regular (hay que fijarse en que podemos sacar
varios Matcher de un mismo Pattern), y segundo si lo que queremos es
encajar una cadena entera, y no partes internas slo. La
clase Matcher permite resetear la cadena que guarda (tambin las
posiciones que ha encajado con find() y de esta forma ahorrar
movimiento al recolector de basura, para ello se usan las
funciones reset() y reset(nuevaCadena). Veamos un ejemplo bastante
simple para esta forma rpida de encajar:
System.out.println(Pattern.matches("(\w+)@(\w+)\.([a-zA-z]
1
{2,6})","[email protected]"));
2 // output: true
3
4
System.out.println(Pattern.matches("(\w+)@(\w+)\.([a-zA-z]
{2,6})","basura [email protected] basura"));
5
// output: false
Por otra parte existe una forma de reemplazar texto en una cadena
utilizando una expresin regular, pero de una forma un poco
enrevesada. Para esto vamos a usar las
funcionesappendReplacement() y appendTail().
Por una parte vamos a ir recorriendo nuestra cadena buscando el patrn
y cuando lo encajemos vamos a guardarlo en un String. Una vez
hayamos acabado de recorrer la cadena, vamos a poner todo el
matcher.appendTail(sb);
11 System.out.println(sb.toString());
12 // output: [email protected]
Por otra parte podemos aplicar modificadores a la expresin regular
como hicimos en Javascript con g, i, m, s. En el siguiente ejemplo
mostramos como hacer el ejemplo de encajar una cadena sin distinguir
maysculas de minsculas:
Pattern patron = Pattern.compile("([a-z]+)",
1
Pattern.CASE_INSENSITIVE);
2 Matcher matcher = patron.matcher("[email protected]");
3
4
5 while(matcher.find())
6
// reemplazamos todo, no solo la primera
7
matcher.appendReplacement(sb, "prueba");
8 matcher.appendTail(sb);
9
10
System.out.println(sb.toString());
11
// output: [email protected]