You are on page 1of 35

Expresses Regulares

Prof. Dr. Ivan Carlos Alcntara de


Oliveira
Expresses Regulares
Motivao Linguagens de Programao Exemplo: JavaScript

Expresses regulares em JavaScript (ou em qualquer


linguagem de programao) so essenciais para
encontrar e/ou substituir partes de uma string.

Em JavaScript, especificamente, podemos utilizar trs


propriedades do objeto String para trabalhar com o
objeto RegExp (de expresso regular): replace(),
match() e search().

Alm dessas propriedades, h tambm os mtodos


exec() e test().
Expresses Regulares
Motivao Linguagens de Programao Exemplo: JavaScript

Criando uma Expresso Regular:

// Utilizando o objeto RegExp

var regular_expression = new RegExp(exemplo');

// Utilizando uma literal com duas barras antes e depois da


expresso regular

var regular_expression = /exemplo/;


Expresses Regulares
Motivao Linguagens de Programao Exemplo: JavaScript

O mtodo test() verifica se o valor foi encontrado na string e retorna um valor


booleano (true ou false) para testes condicionais, por exemplo:
<html><head>
<script type="text/javascript">
<!--
function test(){
// Expresso regular
var minha_expressao = new RegExp("exemplo");
// Varivel do tipo string
var minha_string = 'Eu sou um exemplo \n' + 'Eu tambm sou um exemplo';
alert(minha_string);
// Verifica se a palavra existe na string
if ( minha_expressao.test( minha_string ) ) { // Alerta se existir
alert('Existe a palavra exemplo na string.');
} else { // Alerta se no existir
alert('Nao encontrei a palavra exemplo na string.'); } } //-->
</script><noscript>Desculpe, seu navegador no suporta JavaScript</noscript>
</head><body> <input type="button" onclick="test()" value="teste" /> </body> </html>
Expresses Regulares
Motivao Linguagens de Programao Exemplo: JavaScript - Resultado
Expresses Regulares
Motivao Linguagens de Programao Exemplo: JavaScript

O mtodo replace() pode ser utilizado para substituir as ocorrncias de uma


expresso regular em uma varivel, por exemplo:
<html><head>
<script type="text/javascript">
<!--
function test(){
// Expresso regular
var minha_expressao = /exemplo/ig;
// Varivel do tipo string
var minha_string = 'Oi, eu sou um exemplo, exemplo e \n' +
'EXEMPLO. Alm de mais Exemplo.';
document.writeln( minha_string.replace(minha_expressao, 'TESTE') );
}
//-->
</script><noscript>Desculpe, seu navegador no suporta JavaScript</noscript>
</head><body> <input type="button" onclick="test()" value="teste" /> </body> </html>
Expresses Regulares
Motivao Linguagens de Programao Exemplo: JavaScript - Resultado
Expresses Regulares
Motivao Linguagens de Programao Exemplo: JavaScript

exec() retorna o valor pesquisado na posio 0 de um


array, alm disso, ainda retorna uma propriedade "index"
ou "lastIndex" com a ltima posio onde o valor foi
encontrado.
Alguns modificadores que podemos utilizar so:
MODIFICADOR DESCRIO
Desconsidera letras maisculas e
i
minsculas
g Verifica toda a string (global)
Checa todas as linhas da string
m
(multiline)
Expresses Regulares
Motivao Linguagens de Programao Exemplo: JavaScript

<html><head> <script type="text/javascript"> <!--


// Expresso regular
var minha_expressao = /a/ig;

// Varivel do tipo string


var minha_string = 'Oi, sou uma varivel do tipo string. \n ' + 'Sei que tenho um valor';

// Varivel para receber os valores


var resultado = minha_expressao.exec( minha_string );

// Valor pesquisado
document.write('Encontrei o valor: ' + resultado[0] + '<br>');

// Lao para exibir as posies


while ( resultado ) {
document.write( 'Posio: ' + resultado.index + '<br>' );
resultado = minha_expressao.exec( minha_string );
} //--> </script></head><body></body></html>
Expresses Regulares
Motivao Linguagens de Programao Exemplo: JavaScript
Expresses Regulares
Motivao Linguagens de Programao Exemplo: JavaScript Caracteres ., |, +, * e ?

Quatro dos caracteres de expresses regulares so


utilizados para encontrar ocorrncias especficas de
caracteres em uma string:

o ponto (.): Um caractere apenas;


o barra (a|b): Encontra a ou b na string;
o asterisco (*): Um caractere precedente zero ou mais vezes;
o sinal de mais (+): Um caractere precedente um ou mais vezes;
e o ponto de interrogao (?): Um ou nenhum caractere.

Observe que podemos combinar esses caracteres obtendo


resultados interessantes.
Fonte: http://www.w3schools.com/jsref/jsref_obj_regexp.asp. Acesso em: 02 de Maro de 2015.
Expresses Regulares
Motivao Linguagens de Programao Exemplo: JavaScript

Vamos ver um exemplo em JavaScript que procura os


caracteres:

o, ou, ma, e

dentro de uma String?

Fonte: http://www.w3schools.com/jsref/jsref_obj_regexp.asp. Acesso em: 02 de Maro de 2015.


Expresses Regulares
Motivao Linguagens de Programao JavaScript Exemplo - Resultado
Expresses Regulares
Motivao Linguagens de Programao JavaScript Cdigo Fonte do Exemplo

<HTML>
<HEAD>
<TITLE>Exemplo 1 - Expresses Regulares</TITLE>
<SCRIPT type="text/JavaScript">
// Expresso regular
var minha_expressao = new RegExp('(ou?|ma|e)', 'ig');

var minha_string = 'Ol, sou uma varivel do tipo string. \n ' +


'Eu estou armazenando um conjunto de palavras!';

// Varivel para receber os valores


var resultado = minha_expressao.exec( minha_string );

// Texto a exibir na pgina HTML


document.write('<h1><center>Cdigo Exemplo de Expresses
Regulares</center></h1>');
Expresses Regulares
Motivao Linguagens de Programao JavaScript Cdigo Fonte do Exemplo

document.write('<font color=\"#33AA66\" face=\"verdana\" size=\"4\"><p>A


expresso procura o resultado de <font color=\"#111111\"
face=\"verdana\" size=\"4\">(ou?|ma|e)</font> no
texto:<br/><center></p><font color=\"#222222\" face=\"verdana\"
size=\"4\">'+ minha_string +'</font></center><br/><p>Vamos ver o
resultado?</p><p>Resultado:</p>' );

// Lao para exibir as posies


while ( resultado ) {
document.write('Encontrei o valor: <font color=\"#111111\"
face=\"verdana\" size=\"4\">' + resultado[0] + '</font>, ');
document.write('Posio: <font color=\"#111111\" face=\"verdana\"
size=\"4\">' + resultado.index + '</font><br/>' );
resultado = minha_expressao.exec( minha_string );
}
document.write('</font>');
</SCRIPT>
</HEAD> <BODY></BODY></HTML>
Expresses Regulares
Conceito

A expresso regular a forma mais compacta e


simples de descrever conjuntos regulares, e
usada com essa finalidade em construo de
compiladores, editores, sistemas operacionais,
protocolos, etc.

um formalismo notacional, tambm


considerado gerador.
Expresses Regulares
Definio
Definio: Uma Expresso Regular (ER) sobre um
alfabeto definida como segue:
uma ER (linguagem vazia)
uma ER (linguagem contendo somente a
cadeia vazia )
para cada a , a uma ER
se e so ERs, ento | uma ER. ( OU
alternncia)
se e so ERs, ento uma ER.
(concatenao)
se uma ER, ento ()* uma ER
(exponenciao)
Expresses Regulares
Definio
Expresses regulares representam Linguagens
Regulares
Se uma expresso regular qualquer, ento
L() uma linguagem representada por .
L() = e L(a) = {a} para cada a
Se e so expresses regulares, ento L()
= L()L()
Se e so expresses regulares, ento
L(|) = L() | L() (| ou +)
Se uma expresso regular, ento L(*) =
L()*
Expresses Regulares
Definio

*: | | | |.....

+: | | |.....

+ = *

ordem de precedncia(decrescente):
exponenciao
concatenao
alternncia
Expresses Regulares
Exemplos
Expresso regular
Qual o significado das
aa
expresses ao lado?
ba*

(a|b)*
(a|b)* aa (a|b) *

a* ba* ba*

(a|b)* (aa| bb )

(a| ) (b | ba)*
Expresses Regulares
Exemplos
Expresso regular Linguagem representada
aa Somente a palavra aa
ba* Todas as palavras que comeam com b,
seguido por zero ou mais as
(a|b)* Todas as palavras sobre {a, b}
(a|b)* aa (a|b) * Todas as palavras que contm aa como
subpalavra
a* ba* ba* Todas as palavras contendo exatamente 2 bs

(a|b)* (aa| bb ) Todas as palavras que tem aa ou bb como


sufixo
(a| ) (b | ba)* Todas as palavras que no possuem 2 as
consecutivos
Expresses Regulares
Exemplo
As expresses (a|b)* aa (a|b) * e (a|b)* bb (a|b) *
representam as cadeias que contm aa e bb
respectivamente.

Combinando as duas expresses com o operador |


alternncia, temos a expresso

(a|b)* aa (a|b) * | (a|b)* bb (a|b) * que representa o


conjunto de cadeias que contm as subcadeias aa
ou bb.
Expresses Regulares
Exerccios

1. Enumere as cadeias das linguagens (L) representadas pelas


expresses regulares abaixo:
a) 00
b) (0 | 1)*
c) (01)*
d) (0 | 1)* 00 (0 | 1)*
e) (0 | 1)* 011

2. Seja o alfabeto = { 0, 1 }. Represente as linguagens abaixo


no formato de expresses regulares.
a. L = { *| possui 000 como subpalavra}
b. L = { *| possui 01 como prefixo}.
c. L = { *| possui 10 como prefixo e 01 como sufixo}.
Expresses Regulares
Exerccios
3. Considerando o alfabeto A = {a, b} e as expresses regulares
abaixo, dizer quais so as linguagens representadas (L).
a) a* b) aa* c) a*b d) (ab)*
e) (a | b) f) (a | b)+ g) (a? | b+ )

4. Indique se a cadeia 1011 pertence s linguagens


correspondentes a cada uma das expresses regulares
a) __________ (10)*1011
b) __________ 0*(10 | 11)*
c) __________ 1(00)*(11)*
d) __________ (1 | 00)(01 | 0)1*
Expresso Regular
Exerccios
5. Escreva uma expresso regular para cada uma das
seguintes linguagens sobre o alfabeto {a,b}:
a) O conjunto de todas as cadeias que comeam e terminam
com a e contm no mnimo um b
b) O conjunto de todas as cadeias que terminam em ab
c) O conjunto de todas as cadeias com comprimento igual a 2
d) O conjunto de todas as cadeias com o nmero par de as.

6.) Escreva uma expresso regular para a linguagem sobre o


alfabeto {a,b,c}:
L = cadeias com as e bs sempre terminados com c, tal que
cada a sempre seguido por um b.
Expresso Regular
Exerccios ENADE 2014 Engenharia da Computao
Expresso Regular
Exerccios POSCOMP 2004
Expresso Regular
Exerccios POSCOMP 2008
Expresso Regular
Exerccios POSCOMP 2008
Expresso Regular
Exerccios POSCOMP 2009
Expresso Regular
Exerccios POSCOMP 2014

a) Cadeias sobre o alfabeto {a, b, c} onde o primeiro a precede o primeiro b.


Expresso Regular
Exerccios JavaScript
Baseado nos exemplos estudados em sala sobre JavaScript e Expresses
Regulares, elaborar um programa que procura dentro do texto contido nos prximos
dois slides as palavras: aba, abacaxi, abacate, abacateiro. ER correspondente:
(aba(ca(xi|te(iro)?)?)

Como resultado, apresente em um alert() (ou em uma pgina montada


dinamicamente) as posies do texto onde se encontra cada palavra e a quantidade
de vezes que cada palavra aparece no texto.

Desafio:
Altere o exerccio elaborando um formulrio para permitir que o usurio entre com o
texto dentro de um objeto do tipo HTML textarea, fornea as palavras de busca
separadas por ponto e vrgula em um objeto do tipo text e apresente um boto que,
quando pressionado, chama uma funo que executa uma expresso regular que
gera o resultado descrito anteriormente em um alert() (ou em uma pgina montada
dinamicamente).

Exemplos que podem auxili-lo a elaborar o formulrio em HTML5 so:


1) https://www.html5rocks.com/pt/tutorials/forms/html5forms/
2) http://www.devmedia.com.br/criando-form-de-contato-com-html5-css3-e-
javascript/29415 (data da consulta: 09/02/2017).
Expresso Regular
Exerccios JavaScript
Alguns algoritmos de comparao parcial
Dentre os vrios mtodos de comparao parcial podemos destacar o Largest Common
Subsequence (LCS), as vrias distncias de edio (Edit Distances) e o mtodo dos n-
gramas.
O LCS busca a similaridade entre strings procurando a maior substring em comum entre ambas.
Quanto maior a similaridade entre elas, maior a LCS.
Por exemplo as strings 'abacate' e 'abacaxi' possuem 'abaca' (5 caracteres) como maior substring
em comum. J as strings 'porta' e 'janela' possuem como maior substring em comum apenas
o 'a' (1 caractere). Portanto 'abacaxi' mais parecido com 'abacate' do que 'porta' parecida
com 'janela'.
A ttulo de curiosidade, uma variao do LCS utilizada no comando Unix diff, utilizado para
comparar dois arquivos e dedurar as linhas que so diferentes.
Por outro lado os algoritmos de distncia de edio buscam a similaridade entre as strings
contando quantas operaes de insero, deleo e alterao so necessrias para que a
partir de uma string encontremos a outra. Quanto menor a distncia, mais parecidas so as
strings. Exemplos:
Partindo de 'abacate', alterando o 't' para 'x' e em seguida o 'e' para 'i' obtemos 'abacaxi', portanto
uma distncia de edio igual a 2.
Comeando com 'porta', trocando o 'p' por 'j', o 'o' por 'a', o 'r' por 'n', o 't' por 'e' e finalmente
inserindo um 'l', chegamos em 'janela', o que d uma distncia de 5 operaes.
Por ltimo, o algoritmo dos n-gramas quebra as strings em tokens de comprimento n e conta
quantos tokens em comum elas possuem. Vamos a dois exemplos com n = 3:
Expresso Regular
Exerccios JavaScript
'abacate' => 'aba', 'bac', 'aca', 'cat', 'ate';
'abacaxi' => 'aba', 'bac', 'aca', 'cax', 'axi';

Total: 7 => 'aba', 'bac', 'aca', 'cat', 'ate', 'cax', 'axi';


Comuns: 3 => 'aba', 'bac', 'aca';
Semelhana: 3/7 => 42,86%;

'porta' => 'por', 'ort', 'rta';


'janela' => 'jan', 'ane', 'nel', 'ela';

Total: 7
Comuns: 0
Semelhana: 0/7 => 0%

Note que cada algoritmo mede a semelhana ou a diferena de formas bastante distintas, o que
leva muitas vezes a resultados bem diferentes. Em todos os casos, 'abacate' mais parecido
com 'abacaxi' do que 'porta' parecida com 'janela', mas a intensidade com que isso
determinado varia bastante.
Retirado de: http://sao-paulo.pm.org/pub/comparando-textos-aproximadamente-quase-parecidos.
Data da Consulta: 09/02/2017.
Bibliografia
MIRANDA, L. O. Trabalhando com Expresses Regulares em JavaScript. Abril, 2014. Disponvel em:
https://www.todoespacoonline.com/w/2014/04/expressoes-regulares-em-javascript/. Acesso em:
18/02/2016.
HOPCROFT, J. E; ULLMAN, J. D; MOTWANI, R. Introduo Teoria de Autmatos, Linguagens e Computao.
Rio de Janeiro: Elsevier, 2002. 560P. ISBN 85-352-1072-5.
SUDKAMP, T. A. Languages and Machines: an Introduction to the Theory of Computer Science. 2.ed.
Reading: Addison-Wesley, 1998. 569P. ISBN 0-201-82136-2.
SIPSER, M. Introduo Teoria da Computao. 2. ed. So Paulo: Thompson Pioneira, 2011. 459p. ISBN 978-
85-221-0499-4.
GERSTING, J. L. Fundamentos Matemticos para a Cincia da Computao. 3.ed. Rio de Janeiro: Ltc., 1995.
517P. ISBN 85-216-1041-6.
COHEN, D. I. A. Introduction To Computer Theory. 2. ed. New York: John Wiley & Sons, 1997. 648p. ISBN 0-
471-13772-3.
DIVRIO, T. A.; MENEZES, P. B. Teoria da Computao - Mquinas Universais e Computabilidade, 3a. Ed.,
Porto Alegre: Bookman, 2011. 288p. ISBN 85-7780-824-6.
LEWIS, H. R. Elementos de Teoria da Computao. 2. ed. Porto Alegre: Bookman, 2000. 344p. ISBN 85-7307-
534-1.
MENEZES, P. B. Linguagens Formais e Autmatos. 6. ed. Porto Alegre: UFRGS, 2010. 256p. ISBN 85-7780-
765-7.
RAMOS, M. V. M.; VEGA, I. S.; JOSE NETO, J. Linguagens Formais: Teoria, Modelagem e Implementao.
Porto Alegre: Bookman, 2009. 656p. ISBN 978-85-7780-453-5.