Casamento com Expressões Regulares

93
Casamento com Expressões Regulares Alisson G. Chiquitto Developers Paraná [email protected] 14 de setembro de 2016 Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 1 / 57

Transcript of Casamento com Expressões Regulares

Casamento com Expressões Regulares

Alisson G. Chiquitto

Developers Paraná

[email protected]

14 de setembro de 2016

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 1 / 57

Introdução e Contextualização

Introdução e Contextualização

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 2 / 57

Termo: Regular

Regular?

”Que está de acordo com as regras, as normas, o costume;normal.” (Michaelis Online)

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 3 / 57

Termo: Regular

Regular?

”Que está de acordo com as regras, as normas, o costume;normal.” (Michaelis Online)

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 3 / 57

Padrões de strings

Datas: dd/MM/YYYY;Hora: hh:mm:ss;CPF: 000.000.000-00;CNPJ: 000.000.000/0000-00;Números de telefone: (00) 00000-0000;Senhas: Mínimo de 6 caracteres;Email: [email protected];MD5: 32 caracteres hexadecimais;Caminhos de arquivo: /home/user/apresentacao.pdf;

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 4 / 57

Padrões de strings

Binário: Sequência de 0 e 1;XML/HTML: <tag>conteudo</tag>;IP: 000.000.000.000;MAC: 00:00:00:00:00:00;CEP: 00.000-000;Tipo Sanguíneo: O+, O-, A+, A-, B+, B-, AB+, AB-;Cores hexadecimais: 3 pares de hexadecimais (#FFFFFF);Placa de veículos: 3 letras + 4 dígitos;

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 5 / 57

Padrões de stringsEndereço de entrega

Exemplo:Rua Torre de Belém, 1000, Ap 101, Vila Roque, São Paulo/SP, 02472-035Avenida Brasil, 3000, Centro, Cianorte/PR, 87200-000Praça José Borges do Vale, s/n, Icozeira, Abaré/BA, Icozeira

Padrão:[tipo de logradouro] [logradouro], [número], [complemento], [bairro],[cidade]/[uf], [cep]

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 6 / 57

Padrões de stringsEndereço de entrega

Exemplo:Rua Torre de Belém, 1000, Ap 101, Vila Roque, São Paulo/SP, 02472-035Avenida Brasil, 3000, Centro, Cianorte/PR, 87200-000Praça José Borges do Vale, s/n, Icozeira, Abaré/BA, Icozeira

Padrão:[tipo de logradouro] [logradouro], [número], [complemento], [bairro],[cidade]/[uf], [cep]

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 6 / 57

Padrões de stringsNúmeros no JSON

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 7 / 57

Expressões RegularesObjetivos

Testar substrings;

Procurar substrings;Substituir substrings;

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 8 / 57

Expressões RegularesObjetivos

Testar substrings;Procurar substrings;

Substituir substrings;

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 8 / 57

Expressões RegularesObjetivos

Testar substrings;Procurar substrings;Substituir substrings;

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 8 / 57

Expressões RegularesDefinições

”Uma string especialmente codificada que, quando usada (...) podecorresponder a outras strings.” - Fitzgerald, Michael

”Uma expressão regular é um método formal de se especificar umpadrão de texto.” - Jargas, Aurélio Marinho

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 9 / 57

Expressões RegularesDefinições

”Uma string especialmente codificada que, quando usada (...) podecorresponder a outras strings.” - Fitzgerald, Michael

”Uma expressão regular é um método formal de se especificar umpadrão de texto.” - Jargas, Aurélio Marinho

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 9 / 57

Expressões RegularesExemplos reais

Email:[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}

Número IP:\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b

Cartão de crédito:^4[0-9]{12}(?:[0-9]{3})?$

Trim:^[\s]*(.*?)[\s]*$

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 10 / 57

Expressões RegularesExemplos reais

Email:[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}

Número IP:\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b

Cartão de crédito:^4[0-9]{12}(?:[0-9]{3})?$

Trim:^[\s]*(.*?)[\s]*$

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 10 / 57

Expressões RegularesExemplos reais

Email:[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}

Número IP:\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b

Cartão de crédito:^4[0-9]{12}(?:[0-9]{3})?$

Trim:^[\s]*(.*?)[\s]*$

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 10 / 57

Expressões RegularesExemplos reais

Email:[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}

Número IP:\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b

Cartão de crédito:^4[0-9]{12}(?:[0-9]{3})?$

Trim:^[\s]*(.*?)[\s]*$

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 10 / 57

Representação de caracteres

Representação de caracteres

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 11 / 57

Caracteres no regex

Cada caractere em uma expressão regular pode ser de dois tipos:

MetacaractereTem um significado específico dentro da regex ;

LiteralSignifica ele próprio;

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 12 / 57

Caractere literal

A expressão:ab

Casa com:

f ab

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 13 / 57

Caractere literal

A expressão:ab

Casa com:

b ab a

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 13 / 57

Qualquer caractere: Ponto

O caractere ponto vai casar com (apenas) 1 caractere qualquer.

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 14 / 57

Qualquer caractere: Ponto

A expressão:a.a

Casa com:

aba aBa a5a a-a f ada b ana na

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 14 / 57

Lista de caracteres

”Mais restrito do que o Ponto (.), a lista é um conjunto de caracteresrestrito.”

Exemplos:

[aeiou] lista de vogais;[01] números do conjunto binário;[a-z] letras do alfabeto;

[0123456789] números do conjunto decimal;[0-9] números do conjunto decimal;

[0123456789abcdef] números do conjunto hexadecimal;[0-9a-f] números do conjunto hexadecimal;

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 15 / 57

Lista de caracteres

A expressão:

d[aeiou]d[aeiou]

Casa com:

dado dedo dida

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 16 / 57

Lista de caracteres com intervalos

A expressão:

b[a-z]c

Casa com:

bbc bec o boc a

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 17 / 57

Lista de caracteres com intervalos

A expressão:

[0-9a-f][0-9a-f]

Casa com:

00 7f ff

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 18 / 57

ExemploValidação de endereço MAC

A expressão:

[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]

Casa com:Meu endereço MAC é 00:00:00:00:00:00

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 19 / 57

ExemploValidação de número telefonico

A expressão:

\([0-9][0-9]\)[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]

Casa com:

Fone: (44)91234-5678

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 20 / 57

ExemploValidação de número de CEP

A expressão:

[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]

Casa com:CEP de Cianorte: 87200-163

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 21 / 57

Quantificadores

Quantificadores

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 22 / 57

Tanto faz: 0 ou mais

A expressão:a∗

Casa com:a

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 23 / 57

Tanto faz: 0 ou mais

A expressão:a∗

Casa com:aa

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 23 / 57

Tanto faz: 0 ou mais

A expressão:a∗

Casa com:aaa

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 23 / 57

Tanto faz: 0 ou mais

A expressão:

a[a-z]∗c

Casa com:ac ordo

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 24 / 57

Tanto faz: 0 ou mais

A expressão:

a[a-z]∗c

Casa com:agropec uaria

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 24 / 57

Tanto faz: 0 ou mais

A expressão:

a[a-z]∗c

Casa com:fin anc eiro

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 24 / 57

Opcional: 0 ou 1

A expressão:ae?a

Casa com:aa

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 25 / 57

Opcional: 0 ou 1

A expressão:ae?a

Casa com:aea

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 25 / 57

Opcional: 0 ou 1

A expressão:

a[a-z]?c

Casa com:ac umula

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 26 / 57

Opcional: 0 ou 1

A expressão:

a[a-z]?c

Casa com:b anc o

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 26 / 57

Opcional: 0 ou 1

A expressão:

a[a-z]?c

Casa com:intern ac ional

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 26 / 57

Opcional: 0 ou 1

A expressão:

a[a-z]?c

Casa com:fin anc eiro

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 26 / 57

Tem que ter: 1 ou mais

A expressão:ab+c

Casa com:

abc

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 27 / 57

Tem que ter: 1 ou mais

A expressão:ab+c

Casa com:

abbc

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 27 / 57

Tem que ter: 1 ou mais

A expressão:ab+c

Casa com:

abbbc

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 27 / 57

Tem que ter: 1 ou mais

A expressão:

a[a-z]+d

Casa com:

acord o

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 28 / 57

Tem que ter: 1 ou mais

A expressão:

a[a-z]+d

Casa com:

apresentand o

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 28 / 57

Tem que ter: 1 ou mais

A expressão:

a[a-z]+d

Casa com:

p assad o

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 28 / 57

Tem que ter: 1 ou mais

A expressão:

a[a-z]+d

Casa com:

atividad e

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 28 / 57

Tem que ter: 1 ou maisRegex para nome

A expressão:

[A-Z][a-z]+

Casa com:

Chiquitto

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 29 / 57

Controle

Especifica exatamente quantas repetições consecutivas se espera de umconjunto.

{m,n} m a n;{m,} pelo menos m;{0,n} até n;{m} exatamente m;{0,1} opcional (?);{0,} tanto faz (∗);{1,} tem que ter (+);

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 30 / 57

Controle

A expressão:

ab{2}c

Casa com:

abbc

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 31 / 57

Controle

A expressão:

ab{1,3}c

Casa com:

abc

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 32 / 57

Controle

A expressão:

ab{1,3}c

Casa com:

abbc

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 32 / 57

Controle

A expressão:

ab{1,3}c

Casa com:

abbbc

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 32 / 57

Controle

A expressão:

a[a-z]{1,3}i

Casa com:br asi l

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 33 / 57

Controle

A expressão:

a[a-z]{1,3}i

Casa com:

abri l

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 33 / 57

Controle

A expressão:

a[a-z]{1,3}i

Casa com:ativi dade

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 33 / 57

ExemploValidação de endereço MAC

A expressão:

[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}

Casa com:Meu endereço MAC é 00:00:00:00:00:00

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 34 / 57

ExemploValidação de número telefonico

A expressão:

\([0-9]{2}\)[0-9]{4,5}-[0-9]{4}

Casa com:

Fone: (44)91234-5678

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 35 / 57

ExemploValidação de número de CEP

A expressão:

[0-9]{5}-[0-9]{3}

Casa com:CEP de Cianorte: 87200-163

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 36 / 57

Grupos

Grupos

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 37 / 57

Grupos

”Junta elementos de uma expressão regular”

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 38 / 57

Grupos

A expressão:

a[0-9]+

Casa com:a1

A expressão:

(a[0-9])+

Casa com:a1

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 39 / 57

Grupos

A expressão:

a[0-9]+

Casa com:a12

A expressão:

(a[0-9])+

Casa com:a1a2

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 39 / 57

Grupos

A expressão:

a[0-9]+

Casa com:a123

A expressão:

(a[0-9])+

Casa com:a1a2a3

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 39 / 57

Casamento de endereços físicos (MAC)

A expressão:

[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]

Casa com:

00:e0:4c:02:fa:2b

A expressão:

[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}

Casa com:

00:e0:4c:02:fa:2b

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 40 / 57

Casamento de endereços físicos (MAC)

A expressão:

[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]

Casa com:

00:e0:4c:02:fa:2b

A expressão:

[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}

Casa com:

00:e0:4c:02:fa:2b

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 40 / 57

Casamento de endereços físicos (MAC)

A expressão:

[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}

Casa com:

00:e0:4c:02:fa:2b

A expressão:

([0-9a-f]{2}:){5}[0-9a-f]{2}

Casa com:

00:e0:4c:02:fa:2b

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 41 / 57

Casamento de endereços físicos (MAC)

A expressão:

[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}

Casa com:

00:e0:4c:02:fa:2b

A expressão:

([0-9a-f]{2}:){5}[0-9a-f]{2}

Casa com:

00:e0:4c:02:fa:2b

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 41 / 57

Grupo de alternativas: OU

A expressão:

(super|hiper)mercado

Casa com:

supermercado hipermercado mercado

A expressão:

(super|hiper)?mercado

Casa com:

supermercado hipermercado mercado

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 42 / 57

Grupo de alternativas: OU

A expressão:

(super|hiper)mercado

Casa com:

supermercado hipermercado mercado

A expressão:

(super|hiper)?mercado

Casa com:

supermercado hipermercado mercado

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 42 / 57

Retrovisor: Referência para trás

O retrovisor faz referência a uma string casada por um grupo.

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 43 / 57

Retrovisor: Referência para trás

A expressão:

([a-z]+)-\1

Casa com:quero-quero

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 44 / 57

Retrovisor: Referência para trás

A expressão:

([a-z]+)-\1

Casa com:tico-tico

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 44 / 57

Retrovisor: Referência para trás

A expressão:

([a-z]+)-\1

Casa com:reco-reco

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 44 / 57

Retrovisor: Referência para trás

A expressão:

([a-z]+)-\1

Casa com:

pula-pula

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 44 / 57

Retrovisor: Referência para trás

A expressão:

((band)eira)nte \1 \2a

Casa com:

bandeirante bandeira banda

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 45 / 57

ExemploCasamento com HTML

A expressão:

<([a-z]+)>.*<\/\1>

Casa com:

Oi, meu nome é <strong>Goku</strong>

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 46 / 57

Replace

Replace

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 47 / 57

Remover dígitos

Sem regex:"111.222.333-44"

.replace(/0/g, "@")

.replace(/1/g, "@")

.replace(/2/g, "@")

.replace(/3/g, "@")

.replace(/4/g, "@")

.replace(/5/g, "@")

.replace(/6/g, "@")

.replace(/7/g, "@")

.replace(/8/g, "@")

.replace(/9/g, "@");

Com regex:"111.222.333-44"

.replace(/[0-9]/g, "@");

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 48 / 57

Remover dígitos

Sem regex:"111.222.333-44"

.replace(/0/g, "@")

.replace(/1/g, "@")

.replace(/2/g, "@")

.replace(/3/g, "@")

.replace(/4/g, "@")

.replace(/5/g, "@")

.replace(/6/g, "@")

.replace(/7/g, "@")

.replace(/8/g, "@")

.replace(/9/g, "@");

Com regex:"111.222.333-44"

.replace(/[0-9]/g, "@");

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 48 / 57

Formatar número CPF

"00000000000".replace(/([0-9]{3})([0-9]{3})([0-9]{3})([0-9]{2})/g,"$1.$2.$3-$4"

);

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 49 / 57

Gerar SQL de um CSV

var csv = "São Paulo;SP\n";csv += "Rio de Janeiro;RJ";

csv.replace(/(.*);([A-Z]{2})/g,"Insert Into cidade (uf,cidade) Values (’$2’, ’$1’);"

)

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 50 / 57

Referências

Referências

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 51 / 57

Livros

Expressões Regulares: Guia de Consulta Rápida - Jargas, Aurélio Marinho

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 52 / 57

Livros

Expressões Regulares: Uma Abordagem Divertida - Jargas, Aurélio Marinho

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 53 / 57

Livros

Introdução às Expressões Regulares - Fitzgerald, Michael

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 54 / 57

Referências I

Expressões Regulares - Guia de Consulta Rápidahttp://aurelio.net/regex/guia/

Regular-Expressions.infohttp://www.regular-expressions.info/

Expressões Regulares / Regular Expressions Toolhttp://www.regexp.com.br/

Regular Expression 101 Toolhttps://regex101.com/

Regex Crosswordhttps://regexcrossword.com/

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 55 / 57

Contato

github.com/chiquitto linkedin.com/in/chiquitto

[email protected]

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 56 / 57

The End

Alisson G. Chiquitto (devparana.org) Regex 14 de setembro de 2016 57 / 57