Aula 7.24: Expressões Regulares

Aula 7.24: Expressões Regulares

 

Este artigo faz parte do projeto #LTCode

Expressões regulares são notações usadas para identificar padrões em textos. Portanto uma expressão regular casa com qualquer string que ela define. 

Expressões regulares são suportadas por vários programas em linha de comando e por muitas linguagens de programação para facilitar a resolução de problemas de manipulação de textos. O comando grep é uma ferramenta poderosa e amplamente usada para buscar por expressões regulares em arquivos de texto. Ele imprime as linhas que casam com a expressão regular especificada, na saída padrão.

A sintaxe básica do comando grep é a seguinte: 

[grep [opções] regex [arquivo…]]

  • regex: é a expressão regular que você deseja buscar.
  • arquivo…: são os arquivos onde você quer realizar a busca (opcional).
Opções em linhas de comando a ser utilizados com grep:
  • -i Ignora a distinção entre maiúsculas e minúsculas na busca.
  • -v Inverte o casamento, mostrando todas as linhas que não contêm a expressão regular.
  • -c Mostra o número de casamentos (ou não-casamentos, quando usado com -v).
  • -l Exibe apenas os nomes dos arquivos que contêm a expressão casada, sem exibir o conteúdo das linhas.
  • -L Similar a -l, mas mostra os arquivos que não contêm a expressão.
  • -n Prefixa cada linha casada com o número da linha em que ela aparece no arquivo.
  • -h Para pesquisas em múltiplos arquivos, suprime o nome do arquivo na saída.

Até agora, você pode ter utilizado o grep para buscar strings fixas, mas ele também suporta expressões regulares, permitindo buscas muito mais poderosas. Vamos agora entender o que compõe uma expressão regular:

1. Caracteres
Um caractere é considerado qualquer um que não seja nova linha (\n). Existem dois tipos de caracteres, os literais e os especiais. Os literais são caracteres que se representam (casam eles próprios). Já os especiais, são usados para representar casamentos mais complexos como:
  • Expressão regular básica: ^ $ . [ ] * \
  • Expressão regular estendida: ? + ( ) { } |
Mas se precisar usar um caractere especial para representar a si próprio, deve-se escapá-lo.
2. Delimitadores
Delimitadores são utilizados para marcar o início e o fim da expressão. São tratados como um caractere especial dentro da expressão regular, o que significa que ele não representa a si mesmo. Dependendo da ferramenta que você está utilizando, como o editor de texto Vim, é possível usar diferentes caracteres como delimitadores. Já no caso do grep, por exemplo, não se utiliza delimitador algum.
Para fins de exemplificação, será utilizado o caractere barra (/) como delimitador. Em alguns casos específicos, onde não há ambiguidade, o segundo delimitador pode ser omitido.
3. String simples

A forma mais simples de uma expressão regular é uma string comum, sem nenhum caractere especial, exceto os delimitadores. Uma string simples como essa corresponde exatamente ao texto que ela contém.
Aqui estão alguns exemplos:
/cat/: Esta expressão regular vai casar com palavras ou frases que contenham “cat” no texto, como “cat“, “caterpillar”, “scattered”.
/blue/: Irá casar com “blue“, “blues”, “blueberry”.
Cada uma dessas expressões corresponde diretamente ao texto dentro dos delimitadores, buscando ocorrências exatas dessas sequências em um texto.
4. Caracteres especiais

Ponto (.):
O ponto é um caractere que casa com qualquer caractere único.
Exemplo:
  • Expressão Regular: / .alk/
  • Casamento: espaço + qualquer caractere + “alk”
  • Exemplos:
    • will talk
    • may balk
  • Expressão Regular: /.ing/
  • Casamento: qualquer caractere + “ing”
  • Exemplos:
    • sing song
    • ping
Colchetes ([]):
Os colchetes são usados para definir uma classe de caracteres, permitindo que qualquer caractere dentro da classe seja casado. O circunflexo (^) dentro dos colchetes casa com qualquer caractere que não esteja na classe, e o hífen (-) pode ser usado para definir um intervalo de caracteres.
Exemplo:
  • Expressão Regular: /[bB]ill/
  • Casamento: “b” ou “B” + “ill”
  • Exemplos:
    • bill
    • Bill
    • billed
  • Expressão Regular: /t[aeiou].k/
  • Casamento: “t” + qualquer vogal + qualquer caractere + “k”
  • Exemplos:
    • talkative
    • stink
  • Expressão Regular: /[^a–zA–Z]/
  • Casamento: Qualquer caractere que não é uma letra
  • Exemplos:
    • 1
    • @
Asterisco (*):

O asterisco representa zero ou mais ocorrências do caractere ou expressão regular que o precede.
  • Exemplo:
  • Expressão Regular: /ab*c/
  • Casamento: “a” + zero ou mais “b” + “c”
  • Exemplos:
    • ac
    • abc
    • debbcaabbbc
  • Expressão Regular: /t.*ing/
  • Casamento: “t” + qualquer sequência de caracteres + “ing”
  • Exemplos:
    • thing
    • ting
    • thought of going
Âncoras (^ e $):
As âncoras são usadas para casar com o início (^) ou o final ($) de uma linha.
Exemplo:
  • Expressão Regular: /^T/
  • Casamento: Um “T” no começo da linha
  • Exemplos:
    • This line
    • That time
  • Expressão Regular: /^+[0-9]/
  • Casamento: Um sinal de mais (+) seguido de um dígito no início da linha
  • Exemplos:
    • +5
    • +759
  • Expressão Regular: /:$/
  • Casamento: Um dois pontos no final da linha
  • Exemplos:
    • …bellow:
Escapes (\):
Para casar com caracteres especiais literalmente, você pode usar a barra invertida (\) para escapar esses caracteres.
Exemplo:
  • Expressão Regular: /end\./
  • Casamento: “end” seguido por um ponto literal
  • Exemplos:
    • The end.
    • send.
  • Expressão Regular: /\*/
  • Casamento: Um asterisco literal
  • Exemplos:
    • *.c
    • um asterisco (*)
Cada um desses caracteres especiais permite que você crie expressões regulares que podem corresponder a padrões de texto complexos e específicos, facilitando buscas e manipulações em grandes volumes de texto.

5. Agrupamento de Expressões Regulares
O agrupamento de expressões regulares permite que você agrupe partes de uma expressão usando parênteses escapados \( e \). Isso não só organiza a expressão, mas também permite que você recupere as partes casadas posteriormente. Aqui estão os conceitos principais e exemplos:
Parênteses Escapados \( \):

Os parênteses escapados são usados para agrupar uma parte da expressão regular, permitindo que a string correspondente a esse grupo seja recuperada mais tarde.
Exemplo:
  • Expressão Regular: /a\(b*\)c/
  • Casamento: Esta expressão casa com as mesmas strings que /ab*c/, mas o conteúdo entre “a” e “c” pode ser recuperado como um grupo separado.
  • Exemplos:
    • ac
    • abc
    • abbc
Nesse caso, a string que “b*” casa pode ser armazenada e recuperada, tornando-se útil em operações subsequentes, como substituições ou referências.
Aninhamento de Agrupamentos:

Você também pode aninhar agrupamentos, colocando um grupo dentro de outro. Isso permite capturar subgrupos de dados complexos.
Exemplo:
  • Expressão Regular: \([a–z]\([A–Z]*\)x\)
  • Casamento: Essa expressão casa com um padrão onde uma letra minúscula é seguida por uma sequência de letras maiúsculas, seguida por “x”.
  • Exemplos:
    • Para a string “3 t dMNORx7 l u”, a expressão regular casa com dMNORx, onde:
    • O primeiro agrupamento \([a–z][A–Z]*x\) casa com dMNORx.
    • O segundo agrupamento interno \([A–Z]*\) casa com MNOR`.
Esse tipo de agrupamento é extremamente útil para capturar partes específicas de uma string enquanto ainda se verifica um padrão maior. Ele permite que você crie expressões regulares mais complexas e precisas, com a capacidade de acessar ou manipular as partes casadas conforme necessário.
6. Casamento da Maior Sequência Possível

Nas expressões regulares, a regra geral é que elas sempre tentarão casar a string mais longa possível, começando o mais próximo do início da linha. Isso significa que, ao processar o texto, a expressão regular vai estender o casamento o máximo que puder dentro das limitações do padrão.
Exemplos:
  • Frase: “This (rug) is not what it once was (a long time ago), is it?”
  • Expressão Regular: /Th.*is/
    • Resultado: A expressão casa com “This (rug) is not what it once was (a long time ago), is”.
    • Explicação: A expressão começa com “Th” e, devido ao .*, continua até o último “is” encontrado, casando a sequência mais longa possível entre “Th” e “is”.
  • Expressão Regular: /(.*)/
    • Resultado: A expressão casa com “This (rug) is not what it once was (a long time ago), is it?”.
    • Explicação: O padrão .* dentro de parênteses escapados captura a sequência mais longa possível, o que neste caso é a linha inteira.
  • Frase: “singing songs, singing more and more”
  • Expressão Regular: /s.*ing/
    • Resultado: A expressão casa com “singing songs, singing”.
    • Explicação: Começando com “s”, o padrão .* continua até o último “ing” encontrado, capturando a sequência mais longa que casa com “s” até “ing”.
  • Expressão Regular: /s.*ing song/
    • Resultado: A expressão casa com “singing song”.
    • Explicação: O padrão casa a maior sequência que começa com “s” e inclui “ing song”, capturando apenas a primeira ocorrência de “singing song”.
Próxima aula, em breve.

Leave a Reply

Your email address will not be published. Required fields are marked *