Jump to content

Expressões Regulares - (Guia avançado)


 Compartilhar

Postagens Recomendadas


O objetivo deste artigo é apresentar a estrutura de um regex e aprofundar em cada aspecto e que possa lhe servir como um guia podendo sempre consultar para compreender um regex ou cria-lo do zero.

Servindo como um complemento ao artigo:

 

Para facilitar e organizar nosso pensamento é importante que definamos alguns passos:

1º Precisamos definir um alvo (Target) é o nossa fonte de dados bruta;

2º Definir qual a nossa necessidade (ex: extrair uma data);

3º Aplicarmos o padrão (pattern) baseado na nossa necessidade;

 

Exemplo: 

Target = 1233P86949A9822R1A165B568E22N35S

Necessidade =  descriptografar esse conteúdo desconsiderando os dígitos

Pattern = [^\d]

Resultado = 8 matchs P | A | R | A | B | E | N | S

 

Para testar essa solução podemos utilizar https://www.regextester.com/ 

Agora vamos nos aprofundar em cada aspecto das expressões regulares para entender como chegar nesse resultado

 

Quantifier

Usamos quantifier para dizer quantas vezes determina expressão deve aparecer em sequência

?    - zero ou uma vez.
*    - zero ou mais vezes.
+    - uma ou mais vezes.
{n}  - exatamente n vezes.
{n,} - no mínimo n vezes.
{n,m}- no mínimo n vezes, no máximo m vezes.
.    - o "ponto" significa qualquer char
{ e }- as chaves servem para definir uma quantidade de caracteres específicas que é desejado encontrar. Por exemplo: a{3} - letra a 3 vezes.
\d*  - um dígito zero ou mais vezes. Se quisermos procurar pelo . ou * literalmente (sem significado especial), devemos utilizar o caractere \ 
\    - podemos escapar meta-chars, por exemplo \..
|    - Pipe é usado como operador lógico OR

 

 Classe de caractere

Definimos classes de caracteres dentro de [ ] existem várias classes prontas que nos auxiliam

[A-Z]    - significa de A até Z, sempre maiúscula.
[a-z]    - significa de a até z, sempre minúscula.
[A-Za-z] - significa A-Z ou a-z.
[abc]    - significa a, b ou c.
[123]    - significa 1,2 ou 3
\d       - (minúsculo) significa todos os dígitos e é atalho para [0-9]
\w       - (minúsculo) significa word char e é um atalho para [A-Za-z0-9_].
\s       - significa whitespace normalmente é um atalho para [ \t\r\n\f] onde: O primeiro caractere é um espaço branco.
\t       - é um tab.
\r       - é carriage return.
\n       - é newline.
\f       - é form feed.

Obs: as classes \w ou [A-Za-z] não retornam caracteres com acento, para tal é necessário adicionar os caracteres desejados exemplo:

Target = 123JoãoCaçula4567

Pattern = [A-Za-zãç]

isso serve para qualquer caractere com acento

Uma maneira mais simples para resolver esse problema é usar a classe [À-ü]

Pattern = [A-Za-zÀ-ü]

 

Combinando classes com quantifier

Podemos combinar classes com quantifier para especificar cada vez mais nossa regex

[.-]*   - ponto ou hífen zero, uma ou mais vezes.
[.-]{1} - ponto ou hífen uma vez.
[.-]?   - ponto ou hífen zero ou uma vez.

 

Âncoras

Quando precisamos que encontrar determinada informação delimitando uma parte da informação podemos usar as âncoras:

\b   - (minúsculo) é uma âncora que seleciona um word boundary, isso é o início ou fim da palavra. 
^    - Garantir que nada vem antes.
$    - Garantir que nada vem depois.
\B   - (B maiúsculo) non-word-boundary comportamento inverso a sílaba alvo deve aparecer dentro de uma palavra, nunca no início ou fim.

Exemplos de uso do \B :

Target = 123aaa456

Pattern = \Baaa\B

ou usando quantifier

\Ba{3}\B

 

Grupos

Quando queremos retornar alguma parte dentro da nossa expressão podemos colocar dentro de grupos para isso usamos ( )

() - Declarar um grupo
?: - Non-Capturing group, não retornar deste grupo

Exemplo remover a palavra teste de uma frase 

Target = este é um teste de grupo

Pattern = (?:teste\s+)

 

Backreferences

Quando queremos que um comportamento seja replicado dentro de um grupo podemos usar a sua referência invés de duplicar o mesmo padrão, para isso usa-se um \ seguido pelo número do grupo, começando com 1

Exemplo:

Suponhamos que temos que extrair o conteúdo de dentro de uma tag de um arquivo xml

<tag1 id="teste">teste</tag1>

<tag2 id="teste">teste2</tag2>

<tag1 id="teste">teste3</tag2> - não deve capturar

Podemos solucionar da seguinte forma:

Pattern = <(tag1|tag2).+?>([\w]+)</(tag1|tag2)>

ou então podemos usar a referencia desse grupo:

Pattern = <(tag1|tag2).+?>([\w]+)<\/\1>

 

Negação

As vezes é mais vantajoso selecionarmos a informação que não queremos e para isso podemos utilizar

\W  - (maiúsculo) é a non-word char , ou seja tudo que não é um word char. \W é um atalho para [^\w].
\D  - (maiúsculo) é um non-digit, sendo \D um atalho para [^\d]

Repare também que não usamos a meta-char ^ como âncora pois aparece dentro de uma classe [^\d] seu significado nesta situação é de negação


Exemplos comuns

Validar CPF 

Pattern= (\d{3})[.]?(\d{3})[.]?(\d{3})[-]?(\d{2})

Validar CNPJ

Pattern = (\d{2})[.]?(\d{3})[.]?(\d{3})[/]?(\d{4})[-]?(\d{2})

Validar CPF e CNPJ ao mesmo tempo

Pattern = ((\d{2})[.]?(\d{3})[.]?(\d{3})[/]?(\d{4})[-]?(\d{2}))|((\d{3})[.]?(\d{3})[.]?(\d{3})[-]?(\d{2}))

Validar Inscrição Estadual

Pattern = (?=\d)(?![\d/\-.]*[/\-.]{2})[\d/\-.]{1,16}\d

Validar CEP

Pattern= (\d{2}[.]?\d{3})[-]?(\d{3})
  • Curtir 1
  • Amei 2
Link to comment
Compartilhe em outros sites

Crie uma conta ou entre para comentar 😀

Você precisa ser um membro para deixar um comentário.

Crie a sua conta

Participe da nossa comunidade, crie sua conta.
É bem rápido!

Criar minha conta agora

Entrar

Você já tem uma conta?
Faça o login agora.

Entrar agora
 Compartilhar



Sobre o Fórum

Este é um fórum para todos que fazem parte
do ecossistema de uma Software House!

Bem-vindo(a) ao fórum da Casa do Desenvolvedor, uma comunidade completa, onde desenvolvedores, software houses, profissionais de marketing, experiência e vendas, fornecedores de soluções, aficionados por inovação e tecnologia podem tirar dúvidas, compartilhar novidades e conhecimento, trocar experiências e até postar uns memes que só nós da tecnologia entendemos 😅

Crie agora sua conta e vamos juntos fortalecer
o desenvolvimento de software no Brasil! 🇧🇷

×
×
  • Create New...