Contato Cria

Muito prazer! Nós somos CRIA!

icon_widget_image Atendimento de Segunda a Sexta-feira icon_widget_image R. Misseno de Pádua, 790 - Centro, Lavras - MG, 37200-142 icon_widget_image contato@criainovacao.com.br comercial@criainovacao.com.br icon_widget_image
  /  Metodologia   /  Como usar o poder das expressões regulares

Como usar o poder das expressões regulares

Bom, escolhi esse tópico para a gente desvendar o mistério da tão temida expressão regular, que às vezes pode dar bastante dor de cabeça para entender o que está acontecendo.

Eu comecei a entender melhor as expressões regulares, graças a uma cadeira da faculdade (Linguagens Formais e Autômatos). Nessa cadeira fala muita coisa que melhora sua lógica para desenvolver sua Regex (Regular expressions).

Bom, o que são expressões regulares?

Expressões regulares são formas de você encontrar padrões de caracteres, usada para buscar palavras chaves em um conjunto muito grande de caracteres. Como se fosse um CTRL + F só que mais a fundo do que uma busca simples, além de ser mais detalhado.

Para que as expressões regulares funcionem, precisamos de alguns motores de busca. Um motor (Linguagem de programação) para poder analisar o contexto e fazer a busca usando o Regex (Regular expressions).

Para cada linguagem de programação existe seu motor, mesmo que o Regex (Regular expressions) tenha um padrão fixo, existem algumas diferenças entre as linguagens, mas as lógicas e os padrões não mudam.

Vamos para os exemplos

Agora vamos deixar de enrolação e vamos partir para o que nos interessa. Entre neste link para poder acessar a documentação por completo e ir acompanhando os exemplos abaixo.

Antes de iniciar, vamos escolher nosso motor de busca e usar nossas regex. Para esse artigo, optei por usar javascript, tanto por ser mais fácil para testar, como por não precisar instalar nada em sua máquina. Você pode acessar alguns dos editores online, um deles é o PlayCode e o outro que é só para regex é o Regexr e Regex101.

Bom, em javascript a gente pode escrever um Regex de duas formas, usando expressão literal /…/ ou chamando sua própria instância de seu Objeto new RegExp(“…”) .

A barra invertida “\” (escape) significa que o próximo caractere que seja especial (\, /, *, ., [], {} … e etc) não seja interpretado de forma literal, e sim como um caractere normal, exceto para algumas letras do alfabeto que se você colocar a \ ele vai entender como um caractere literal, uns dos exemplos veremos a seguir.

/\d/

Dróide BB8

No caso acima, o \d procura alguma correspondência entre 0 a 9, em uma cadeia de caracteres. Caso não tivesse colocado o \ ele iria procurar apenas pela primeira correspondência “d” que encontrasse na cadeia de caracteres.

Exemplo 1

Vamos começar com esse problema aqui, eu tenho um arquivo muito extenso CSV (Excel) com várias informações de clientes, e quero pegar todos os números telefônicos da lista.

nome / sexo / idade / telefone

Uanderson; Masculino; 21; (88) 99999-9999

Elias; Masculino; 33; (35) 8888-8888

Gabriela; Feminino; 25; (35) 977777777

Michael; Masculino; 23; (35) 66666666

A gente pode fazer da forma mais fácil, mas nem sempre a forma mais fácil é a melhor ou mais otimizada, a regex ficaria da seguinte forma.

/\d\d\d\d\d-\d\d\d\d/

Como citamos acima, o \d é uma classe de caracteres que cujo valor são números, podendo variar entre 0 a 9.

Sabemos que um número telefônico é formado por 5 números, um hífen (-) e mais 4 números.

⠀⠀⠀⠀⠀⠀⠀⠀⠀\d\d\d\d\d (5 números)

⠀⠀⠀⠀⠀⠀⠀⠀⠀- (hífen da máscara do telefone)

⠀⠀⠀⠀⠀⠀⠀⠀⠀\d\d\d\d (4 números)

Nessa forma estamos ignorando os DDD, queremos apenas os números telefônicos. Com essa regex, todos os números que seguirem esse padrão (99999–9999) serão encontrados, e os demais a Regex descartará.

Exemplo 2

No Ex1, a gente fez uma busca para encontrar todos os números telefônicos com esse padrão (99999–9999), no Ex2 vamos fazer uma busca que inicie com o DDD “(88)” e siga o mesmo padrão anterior.

/\(88\) \d\d\d\d\d-\d\d\d\d/

No exemplo acima, usamos as barras invertidas \(escape) para fazer com que os parênteses não sejam interpretados como um caractere literal.

Exemplo 3

Bom, e os que têm menos que 5 dígitos antes do hífen (-), e os que também não tem hífen (-), fazemos o quê para resolver esse problema?

Usaremos o quantificador interrogação “?” para fazer uma repetição de um caractere 0 ou 1 vez. Veja na documentação para entender melhor o que a interrogação faz.

/ab?cc/

No caso acima, eu quero todos que se iniciam com “a” e que tenha ou não apenas um “b” entre o “a” e o “c” e termine com “cc” no final.

alcc = inválida

abcc = válida

acc = válida

bcc = inválida

 

/\(35\) \d?\d\d\d\d-?\d\d\d\d/

No caso acima, a interrogação está repetido o primeiro \d 0 ou 1 vez, e repetindo o hífen (-) no número telefônico 0 ou 1 vez. Isso já resolve nosso problema, se tem ou não o 9 inicial e se o número foi cadastrado ou não com o hífen (-).

Como foi citado no início, nem sempre o mais fácil é o mais otimizado, vamos aperfeiçoar o que temos feito. Para melhorar a nossa regex iremos usar alguns dos quantificadores para ficar menos verboso. As chaves “{}” também são quantificadores de repetições onde podemos passar dois parâmetros dentro das chaves. Por exemplo: {x,y}, x é o número mínimo de repetições e y é o número máximo de repetições, tal que x e y sejam inteiros positivos.

/\(35\) \d{4,5}-?\d{4}/

No caso acima, percebemos que a primeira interrogação foi removida, pois usando os quantificadores e passando uma quantidade mínima e máximo podemos fazer uma regex que aceite tanto com 4 ou 5 dígitos antes do hífen (-). Já na segunda parte depois do hífen (-), temos só um parâmetro que seria o x, quando passamos apenas um parâmetro, significa que é uma quantidade fixa, que seria 4 dígitos numéricos.

Bom, e falando mais um pouco dos quantificadores, podemos expressar uma quantidade mínima e máxima que não tenha tamanho, no caso passaremos só o primeiro parâmetro seguido de uma vírgula, por exemplo {5,}.

/\d{5,}/

555 = inválida

55555 = válida

55555555555 = válida

Esse artigo  foi uma pequena introdução do que podemos fazer com expressões regulares, tem muito mais caracteres especiais para brincar com as Regexs. Para mais informações, consulte a documentação que deixei no link acima para entender os outros caracteres que não foram passados aqui, pois são muitos e o texto ficaria muito extenso.

Abraço e até o próximo.

Texto escrito pelo nosso colaborador Uanderson Nunes de Lima.