Uma Introdução às Expressões Regulares

Introdução

Como administradores de sistema, desenvolvedores, engenheiros de QA, engenheiros de suporte, etc., é necessário encontrar um padrão específico, como um conjunto de endereços IP pertencentes a determinado intervalo ou um intervalo de carimbos de tempo ou grupos de nomes de domínio ou subdomínio, a partir de arquivos. Também pode ser necessário encontrar uma palavra soletrada de uma maneira específica ou encontrar possíveis erros de digitação em um arquivo. É aqui que as expressões regulares entram em cena.

Expressões regulares são modelos para corresponder padrões (ou às vezes para não corresponder padrões). Elas fornecem uma maneira de descrever e analisar texto. Este tutorial dará uma visão geral das expressões regulares sem entrar em particularidades de qualquer linguagem. Nós simplesmente usaremos o egrep para explicar os conceitos.

Expressões Regulares

Expressões regulares consistem em dois tipos de caracteres:

  • os caracteres regulares literais e

  • os metacaracteres

são aqueles que conferem poder às expressões regulares.

Considere o seguinte arquivo country.txt onde a primeira coluna é o nome do país, a segunda coluna é a população do país, e a terceira coluna é o continente.

$ cat country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Argentina,36955182,Latin America
Brazil,172860370,Latin America
Cameroon,15421937,Africa
Japan,126549976,Asia

Metacaracteres Âncora

O primeiro grupo de “metacaracteres” que discutiremos são ^ e $. ^ e $ correspondem ao início e ao fim de um padrão, respectivamente, e são chamados de metacaracteres âncora.

Para descobrir o nome de todos os países cujo nome começa com I, usamos a expressão:

$ egrep '^I' country.txt
India,1014003817,Asia
Italy,57634327,Europe

ou para descobrir todos os países cujos nomes de continente terminam com e, fazemos:

$ egrep 'e$' country.txt
Italy,57634327,Europe

O próximo metacaractere é o ponto (.), que corresponde a qualquer um caractere. Para corresponder a todas as linhas em que o nome do país tem exatamente 5 caracteres de comprimento:

$ egrep '^.....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Japan,126549976,Asia

E quanto a encontrar todas as linhas em que o nome do país começa com I ou J e o nome do país tem 5 caracteres de comprimento?

$ egrep '^[IJ]....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia

[…] é chamado de conjunto de caracteres ou uma classe de caracteres. Dentro de um conjunto de caracteres, apenas um dos caracteres fornecidos é correspondido.

Um ^ dentro do conjunto de caracteres nega o conjunto de caracteres. O exemplo a seguir corresponderá a nomes de países com cinco caracteres de comprimento, mas que não começam com I ou J.

$ egrep '^[^IJ]....,' country.txt
Yemen,1184300,Asia

O Metacaractere de Agrupamento e a Alternância

Para corresponder a todas as linhas contendo Ásia ou África:

$ egrep 'Asia|Africa' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia

Isso também pode ser feito considerando A e a em comum.

$ egrep 'A(si|fric)a' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia

Quantificadores

Em vez de escrever

$ egrep '^[IJ]....,' country.txt

podemos escrever

$ egrep '^[IJ].{4},' country.txt

onde {} são chamados de quantificadores. Eles determinam quantas vezes o caractere antes deles deve ocorrer.

Também podemos fornecer um intervalo:

$ egrep '^[IJ].{4,6},' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia

Isso corresponderá a nomes de países começando com I ou J e tendo de 4 a 6 caracteres após ele.

Há alguns atalhos disponíveis para os quantificadores. Por exemplo,

{0,1} é equivalente a ?

$ egrep '^ab{0,1}c$' filename

é o mesmo que

$ egrep '^ab?c' filename

{0,} é equivalente a *

$ egrep '^ab{0,}c$' filename

é o mesmo que

$ egrep '^ab*c' filename

{1,} é equivalente a +

$ egrep '^ab{1,}c$' filename

é o mesmo que

$ egrep '^ab+c' filename

Vamos ver alguns exemplos envolvendo as expressões que vimos até agora. Aqui, em vez de procurar em um arquivo, procuramos na entrada padrão. O truque que usamos é que sabemos que o grep (ou egrep) procura por um padrão e, se um padrão for encontrado, a linha inteira contendo o padrão é mostrada.

Gostaríamos de descobrir todas as possíveis maneiras de soletrar a frase a cor cinza era sua favorita.

A expressão seria:

$ egrep 'the gr[ea]y colou?r suit was his favou?rite'
the grey color suit was his favourite
the grey color suit was his favourite

the gray colour suit was his favorite
the gray colour suit was his favorite

Olhando para a expressão acima, podemos ver que:

  • cinza pode ser soletrado como cinza ou gray

  • cor pode ser escrita como cor ou color, isso significa que o u é opcional então usamos u?

  • similarmente favorito ou favorito pode ser escrito favou?rito

E quanto a combinar um código postal dos EUA?

$ egrep '^[0-9]{5}(-[0-9]{4})?$'
83456
83456

83456-

834562

92456-1234
92456-1234

10344-2342-345

Mais um exemplo de combinar todos os horários válidos em um relógio de 24 horas.

$ egrep '^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]'
23:44:02
23:44:02

33:45:11

15:45:33
15:45:33

No exemplo acima, dissemos que, se o primeiro dígito da hora for 0 ou 1, então o segundo será
qualquer um de 0 a 9. Mas se o primeiro dígito for 2, então os valores permitidos para o segundo dígito são 0,1, 2 ou 3.

Fronteira de Palavra

Para escrever um padrão para combinar as palavras terminando com color, de modo que unicolor, aquarela, multicolor etc.
sejam correspondidos mas não colorless ou colorful. Tente esses exemplos por si mesmo, para se familiarizar com eles:

$ egrep 'color\>'

Em seguida, para combinar colorless e colorful, mas não unicolor, aquarela, multicolor, etc.

$ egrep '\<color'

Assim para combinar a palavra exata color, nós fazemos:

$ egrep '\<color\>'

Referências cruzadas

Suponhamos que queremos encontrar todas as palavras que foram digitadas duplicadas, como o o ou antes antes, temos que usar referências cruzadas. As referências cruzadas são usadas para lembrar padrões.

Aqui está um exemplo:

$ egrep "\<the\> \1"

Ou da forma genérica:

$ egrep "\<(.*)\> \1"

O exemplo acima pode ser usado para encontrar todos os nomes em que o primeiro e o último nomes são iguais. No caso de haver mais de um conjunto de parênteses, então o segundo, terceiro, quarto, etc. podem ser referenciados com \2, \3, \4, etc.

Isto é apenas uma introdução ao poder das expressões regulares.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-regular-expressions