Expressões Regulares

Frank Coelho de Alcantara -2020    

Expressões Regulares

foto de Stephen Keene

Álgebra criada por Stephen Kleene em 1956, enquanto estuda linguagens para uso em sistemas de inteligência artificial.

O conceito de computação como temos hoje ainda estava se solidificando.

União

Se $L_1$ e $L_2$ são linguagens, então $L_1 \cup L_2$ é o conjunto de todas as strings que estão em $L_1$ ou $L_2$, ou em ambas.

Se $L_1=\{bonito\}$ e $L_2=\{muito\}$ então $$L_1 \cup L_2 = \{bonito, muito\}$$

Se $L_1=\{0, 00\}$ e $L_2=\{1, 11\}$ então $$L_1 \cup L_2 = \{0, 00, 1, 11\}$$

Concatenação

Se $L_1$ e $L_2$ são linguagens, então $L_1 \cdot L_2$ a concatenação $L_1L_2$ é o conjunto de todas as strings na forma $xy$ tal que $x \in L_1$ e $y \in L_2$

Se $L_1=\{bom\}$ e $L_2=\{dia\}$ então $$L_1L_2 = \{bomdia\}$$

Se $L_1=\{0, 00\}$ e $L_2=\{1, 11\}$ então $$L_1L_2 = \{01, 011, 001, 0011\}$$

Kleene Star

Se $L$ é uma linguagem, então: $$L^* = \varepsilon \cup L \cup LL \cup LLL \cup LLLL...$$

  1. $L = \{a\} \therefore L^* = \{\varepsilon, a, aa, aaa, aaaa, ...\}$
  2. $L = \{0,1\} \therefore L^* = \{\varepsilon, 0, 1, 00, 01, 10, 11, 100,...\}$

Note que:

  1. $L = \{\} \therefore L^* = \{\varepsilon\}$
  2. $L^{**} = L^*$

Revisão

$\varepsilon$ é uma expressão regular que identifica o string vazio.

Um símbolo qualquer como $a$ é uma expressão regular que identifica a string "a".

Se $r$ e $s$ são expressões regulares então $r\cup s = r+s = r|s$ é uma expressão regular.

Se $r$ e $s$ são expressões regulares então $r\cdot s = rs$ é uma expressão regular.

Se $r$ é uma expressão regular então $r^*$ é uma expressão regular.

Se $r$ é uma expressão regular então $(r)$ é uma expressão regular.

Exemplos

O símbolo Q, por si só, é uma expressão regular que identifica strings "Q".

Casa | Cachorro é uma expressão regular que identifica o string "Casa" ou o string "Cachorro".

Se Para e Médico são expressões regulares então ParaMédico é uma expressão regular que identifica a string "ParaMédico".

Se $a$ é uma expressão regular então $a^*$ é uma expressão regular que identifica qualquer uma das seguintes strings $a, aa, aaa, aaaa...$.

Associação

As operações união, concatenação e Kleene Star são associativas a esquerda: $$a|b|c = ((a|b)|c)$$

Por exemplo: $a|b^* c \equiv a|(b^*)c$ ou: $$ \{a\} \cup ((\{b\}^*)(\{c\}) = \{a, c, bc, bbc, bbbc...\}$

a Expressão regular $ab^*$ quando aplicada a string $\{aabb\}$ irá identificar $\{a, ab, abb\}$

Exemplos 2

RegexIdentifica
$abc$$\{abc\}$
$ab^*c$$\{ac, abc, abbc, abbbc...\}$
$c(a|b|c)^*c$O conjunto de todas as strings de a's, b's e c's de comprimento maior ou igual a 2 começando e terminando com c.
$b^*(ab*ab*)*$o conjunto de todas as strings de a's e b's com un número par de a's. $\{\varepsilon, aa, aab, aba, baa, aaaa, aabb, abab, abba...\}$

Especificadores

metacaractere conhecido como significado
. curinga qualquer caractere, exceto a quebra de linha \n
[...] conjunto qualquer caractere incluído no conjunto
[^...] conjunto negado qualquer caractere não incluído no conjunto
\d dígito o mesmo que [0-9]
\D não-digíto o mesmo que [^0-9]
\s branco espaço, quebra de linha, tabs etc.; o mesmo que [ \t\n\r\f\v]
\S não-branco o mesmo que [^ \t\n\r\f\v]
\w alfanumérico o mesmo que [a-zA-Z0-9_] (mas pode incluir caracteres Unicode; ver flag_unicode)
\W não-alfanumérico o complemento de \w
\ escape anula o significado especial do metacaractere seguinte; por exemplo, \. representa apenas um ponto, e não o curinga

Quantificadores e Âncoras

metacaractere significado
{n} exatamente n ocorrências
{n,m} no mínimo n ocorrências e no máximo m
{n,} no mínimo n ocorrências
{,n} no máximo n ocorrências
? 0 ou 1 ocorrência; o mesmo que {,1}
+ 1 ou mais ocorrência; o mesmo que {1,}
* 0 ou mais ocorrência
^ início do texto, ou de uma linha com o flag re.MULTILINE
\A início do texto
$ fim do texto, ou de uma linha com o flag re.MULTILINE; não captura o \n no fim do texto ou da linha
\Z fim do texto
\b posição de borda, logo antes do início de uma palavra, ou logo depois do seu término; o mesmo que a posição entre \W e \w ou vice-versa
\B posição de não-borda

Na Prática

Usando o site www.regex101.com

Identificar um número de telefone da forma como a pessoa escrever incluíndo os dados internacionais de ddi e ddd.

Identificar um CEP, segundo o padrão brasileiro, da forma como a pessoa escrever, incluíndo espaços, pontos e hífens.

Identificar um CPF, segundo o padrão brasileiro, da forma como a pessoa escrever, incluíndo espaços, pontos e hífens.

Resolva o exercício participativo clicando aqui.

Material de apoio

Você pode baixar o material de apoio clicando aqui