Aula 7.24: Expressões Regulares

Editorial Team
10 Min Read


 

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 common casa com qualquer string que ela outline. 

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 common especificada, na saída padrão.

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

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

  • regex: é a expressão common 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 common.
  • -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 Related 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 common:

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 common básica: ^ $ . [ ] *
  • Expressão common 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 common, 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 common é 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 common 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 Common: / .alk/
  • Casamento: espaço + qualquer caractere + “alk”
  • Exemplos:
    • will speak
    • might balk
  • Expressão Common: /.ing/
  • Casamento: qualquer caractere + “ing”
  • Exemplos:
    • sing tune
    • 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 Common: /[bB]ailing/
  • Casamento: “b” ou “B” + “ailing”
  • Exemplos:
    • invoice
    • Invoice
    • invoiceed
  • Expressão Common: /t[aeiou].okay/
  • Casamento: “t” + qualquer vogal + qualquer caractere + “okay”
  • Exemplos:
    • speakative
    • stink
  • Expressão Common: /[^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 common que o precede.
  • Exemplo:
  • Expressão Common: /ab*c/
  • Casamento: “a” + zero ou mais “b” + “c”
  • Exemplos:
    • ac
    • abc
    • debbcaabbbc
  • Expressão Common: /t.*ing/
  • Casamento: “t” + qualquer sequência de caracteres + “ing”
  • Exemplos:
    • factor
    • ting
    • considered going
Âncoras (^ e $):
As âncoras são usadas para casar com o início (^) ou o closing ($) de uma linha.
Exemplo:
  • Expressão Common: /^T/
  • Casamento: Um “T” no começo da linha
  • Exemplos:
    • This line
    • That time
  • Expressão Common: /^+[0-9]/
  • Casamento: Um sinal de mais (+) seguido de um dígito no início da linha
  • Exemplos:
    • +5
    • +759
  • Expressão Common: /:$/
  • Casamento: Um dois pontos no closing da linha
  • Exemplos:
    • …bellow:
Escapes ():
Para casar com caracteres especiais literalmente, você pode usar a barra invertida () para escapar esses caracteres.
Exemplo:
  • Expressão Common: /finish./
  • Casamento: “finish” seguido por um ponto literal
  • Exemplos:
    • The finish.
    • sfinish.
  • Expressão Common: /*/
  • 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 common, permitindo que a string correspondente a esse grupo seja recuperada mais tarde.
Exemplo:
  • Expressão Common: /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 Common: ([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 common 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 common vai estender o casamento o máximo que puder dentro das limitações do padrão.
Exemplos:
  • Frase: “This (rug) will not be what it as soon as was (a very long time in the past), is it?”
  • Expressão Common: /Th.*is/
    • Resultado: A expressão casa com “This (rug) will not be what it as soon as was (a very long time in the past), 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 Common: /(.*)/
    • Resultado: A expressão casa com “This (rug) will not be what it as soon as was (a very long time in the past), 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 increasingly more”
  • Expressão Common: /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 Common: /s.*ing tune/
    • Resultado: A expressão casa com “singing tune”.
    • Explicação: O padrão casa a maior sequência que começa com “s” e inclui “ing tune”, capturando apenas a primeira ocorrência de “singing tune”.
Próxima aula, em breve.
Share This Article