Manual prático de Expressões regulares com exemplos simples; aprenda regex agora!




Uma sequência típica de caracteres ASCII ou Unicode faz das Expressões regulares (regex ou regexp) serem assustadoramente úteis na extração de ideias de qualquer texto. Sua função principal é procurar e substituir uma sentença, se necessário, por uma ou mais semelhanças de um padrão de pesquisa particular.

Quantas vezes você quis em sua programação extrair parte do texto de uma string e não sabia como fazer, pois é, para esse trabalho é que existem as expressões regulares, ou simplesmente regex.

Já os campos para aplicação variam da validação à observação ou, simplesmente a substituição de strings, passando pela tradução de dados para outras formas usadas na web e em diversas outras linguagens.

Com as mínimas qualidades sobre o suporte dos recursos mais avançados e versões de sintaxe suportadas pelos motores, um dos recursos mais interessantes é que, depois de aprender a sintaxe você pode realmente usar essa apetrecho em (quase) todas as linguagens de plano (PHP, MySql, JQuery, JavaScript, perl, java, ruby, c/C++, python, delphi, vB, C#) e muitas outras linguagens.

Vamos iniciar estudando alguns exemplos e explicações com exemplos bem simples para tornar a aprendizagem ainda mais fácil.

Regex – Expressões Regulares

Âncoras — ^ and $

^O corresponde a qualquer string que comece com “O” => Teste aqui
fim$ corresponde a uma string que termina com “fim”
^O fim$ correspondência exata de string (começa e termina com “O fim“)
roer corresponde a qualquer string que contenha o texto “roer”


Quantificadores — * + ? and {}

abc* corresponde a uma string que tem ab seguido por zero ou mais c = Teste aqui
abc+ corresponde a uma string que tem ab seguido por um ou mais c
abc? corresponde a uma string que tem ab seguido por zero ou um c
abc{2} corresponde a uma string que tem ab seguido por 2 c
abc{2,} corresponde a uma string que tem ab seguido por 2 ou mais c
abc{2,5} corresponde a uma string que tem ab seguido por 2 até 5 c
a(bc)* corresponde a uma string que tem a seguido por zero ou mais cópias da sequência bc
a(bc){2,5} corresponde a uma string que tem a seguido por 2 a 5 cópias da sequência bc


Operadores OR – | ou []

a(b|c) corresponde a uma string que tem a seguido por b ou c (e captura b ou c)
a[bc] igual ao anterior, mas sem capturar b ou c


Classes de caracteres – \d \w \s e .

\d corresponde a um único caractere que é um dígito -> Experimente!
\w corresponde a um caractere de palavra (caractere alfanumérico mais sublinhado)
\s corresponde a um caractere de espaço em branco (inclui tabulações e quebras de linha).
. corresponde a qualquer caractere -> Experimente!
Use o . operador com cuidado, pois muitas vezes a classe ou a classe de caractere negado (que abordaremos a seguir) são mais rápidas e precisas.
\d, \w e \s também apresentam suas negações com \D, \W e \S respectivamente.
Por exemplo, \D executará a correspondência inversa em relação àquela obtida com \d.
\D corresponde a um único caractere não-dígito
Para ser entendido literalmente, você deve escapar os caracteres ^.[$()|*+? {\ Com uma barra invertida \, pois eles têm um significado especial.
\$\d corresponde a uma string que tem um $ antes de um dígito
Observe que você também pode combinar caracteres não imprimíveis, como tabulações \ t, novas linhas \ n, retornos de carro \ r.


Bandeiras

Estamos aprendendo a construir uma regex, mas esquecendo um conceito fundamental: sinalizadores.
Um regex geralmente vem dentro deste formato /abc/, onde o padrão de pesquisa é delimitado por dois caracteres de barra /.

No final, podemos especificar um sinalizador com esses valores (também podemos combiná-los): g (global) não retorna após a primeira correspondência, reiniciando as pesquisas subsequentes a partir do final da correspondência anterior m (várias linhas) quando ativado ^ e $ corresponderão ao início e ao final de uma linha, em vez de toda a string i (insensível) torna toda a expressão insensível a maiúsculas e minúsculas (por exemplo, /aBc/i corresponderia a AbC)


Tópicos intermediários – Agrupando e capturando()

a(bc) parênteses criam um grupo de captura com o valor bc
a(?:bc)* usando ?: desativamos o grupo de captura
a(?<foo>bc) usando ?<foo> colocamos um nome para o grupo

Este operador é muito útil quando precisamos extrair informações de strings ou dados usando sua linguagem de programação preferida. Quaisquer ocorrências múltiplas capturadas por vários grupos serão expostas na forma de um array clássico: acessaremos seus valores específicos usando um índice no resultado da correspondência.

Se escolhermos colocar um nome para os grupos (usando (?<foo> …)), poderemos recuperar os valores do grupo usando o resultado da correspondência como um dicionário onde as chaves serão o nome de cada grupo.


Expressões de colchetes – []

[abc] corresponde a uma string que tem um a ou ab ou ac – é o mesmo que a|b|c
[a-c] igual ao anterior
[a-fA-F0-9] uma string que representa um único dígito hexadecimal, sem distinção entre maiúsculas e minúsculas
[0-9]% uma string que tem um caractere de 0 a 9 antes de um sinal de %
[^a-zA-Z] uma string que não tem uma letra de a a z ou de A a Z. Neste caso, o ^ é usado como negação da expressão


Jogo ganancioso e preguiçoso

Os quantificadores (* + {}) são operadores gananciosos, portanto, eles expandem a correspondência tanto quanto podem através do texto fornecido.
Por exemplo, <.+> Corresponde a <div>div simples</div> em: Este é um teste de <div>div simples</div>. Para capturar apenas a tag div, podemos usar um ? para torná-lo preguiçoso:
<.+?> corresponde a qualquer caractere uma ou mais vezes incluído em < e >, expandindo conforme necessário

Observe que uma solução melhor deve evitar o uso de . em favor de um regex menor:
<[^<>]+> corresponde a qualquer caractere, exceto < ou > uma ou mais vezes incluído dentro de < e >


Tópicos avançados

Limites – \b e \B
\babc\b realiza uma pesquisa “somente palavras inteiras”
\b representa uma âncora como o acento circunflexo (é semelhante a $ e ^) correspondendo às posições em que um lado é um caractere de palavra (como \w) e o outro lado não é um caractere de palavra (por exemplo, pode ser o início da string ou um caractere de espaço).

Ele vem com sua negação, \B. Corresponde a todas as posições em que \b não corresponde e pode ser, se quisermos encontrar um padrão de pesquisa totalmente cercado por caracteres de palavra.
\Babc\B corresponde apenas se o padrão estiver totalmente rodeado por caracteres de palavra


Referências anteriores – \1

([abc])\1 usando \1 corresponde ao mesmo texto que foi correspondido pelo primeiro grupo de captura
([abc]) ([de])\2\1 podemos usar \2 (\3, \4, etc.) para identificar o mesmo texto que foi correspondido pelo segundo (terceiro, quarto, etc.) grupo de captura
(?<completo>[abc])\k<completo> colocamos o nome completo no grupo e o referimos posteriormente (\k<fcompletoo>). O resultado é o mesmo do primeiro regex.

Resumo

Como você viu, os campos de aplicação do regex podem ser múltiplos e tenho certeza de que você reconheceu pelo menos uma dessas tarefas entre aquelas vistas em sua carreira de desenvolvedor, aqui está uma lista rápida:

  • validação de dados (por exemplo, verifique se uma string de tempo está bem formada)
  • coleta de dados (especialmente web scraping, encontre todas as páginas que contêm um determinado conjunto de palavras, eventualmente em uma ordem específica)
  • organização de dados (transformar dados “brutos” para outro formato)
  • análise de string (por exemplo, capturar todos os parâmetros URL GET, capturar texto dentro de um conjunto de parênteses)
  • substituição de string (por exemplo, mesmo durante uma sessão de código usando um IDE comum para traduzir uma classe Java ou C # no respectivo objeto JSON – substitua “;” por “,” torne-o minúsculo, evite a declaração de tipo, etc.)
  • destaque de sintaxe, renomeação de arquivo, detecção de pacotes e muitas outras aplicações envolvendo strings (onde os dados não precisam ser textuais)

Traduzido a partir do texto de Jonny Fox em: medium.com


Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Ativar Timer