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, em arquivos. Também pode ser necessário encontrar uma palavra soletrada de determinada maneira ou encontrar possíveis erros de digitação em um arquivo. É aqui que entram as expressões regulares.
As expressões regulares são modelos para corresponder padrões (ou às vezes não corresponder padrões). Elas fornecem uma maneira de descrever e analisar texto. Este tutorial fornecerá uma visão das expressões regulares sem entrar em particularidades de qualquer linguagem. Simplesmente usaremos egrep para explicar os conceitos.
Expressões Regulares
As expressões regulares consistem em dois tipos de caracteres:
-
os caracteres literais regulares e
-
os metacaracteres
são aqueles que dão 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 de Âncora
O primeiro grupo de “metacaractere” que discutiremos são ^ e $. ^ e $ correspondem ao início e ao fim de um padrão, respectivamente, e são chamados de metacaracteres de â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 que têm nomes de continentes terminando 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 um 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 tomando A e a comuns.
$ 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á aos nomes de países que começam com I ou J e têm de 4 a 6 caracteres depois disso.
Existem 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 pesquisar em um arquivo, pesquisamos a partir da 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, então toda a linha contendo o padrão é mostrada.
Gostaríamos de descobrir todas as formas possíveis de soletrar a frase o fato da cor cinza era o seu favorito.
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 u é opcional então usamos u?
-
similarmente favorito ou favorite pode ser escrito como favou?rite
E quanto à correspondência de 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 correspondência de 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.
Borda da Palavra
Para escrever um padrão que corresponda às palavras que terminam com color, de modo que unicolor, aquarela, multicolor, etc. sejam correspondidos, mas não colorless ou colorful. Experimente estes exemplos você mesmo, para se familiarizar com eles:
$ egrep 'color\>'
Em seguida, para corresponder a colorless e colorful, mas não unicolor, aquarela, multicolor, etc.
$ egrep '\<color'
Assim, para corresponder à palavra exata color, fazemos:
$ egrep '\<color\>'
Referências cruzadas
Suponhamos que desejamos fazer correspondência com todas as palavras que foram digitadas duplicadamente, 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 de maneira genérica:
$ egrep "\<(.*)\> \1"
O exemplo acima pode ser usado para encontrar todos os nomes nos quais os primeiros e últimos 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