D. Expressões Regulares (Fonte: Tcl/Tk - Programação Linux, 2005)

Expressões regulares permitem localizar e extrair sequências de caracteres de um arquivo ou de uma string.

Em Tcl existem dois comando para manipular expressões regulares : regexp e regsub. O comando regexp retorna 1 caso uma expressão regular combine com um texto passado para o comando, e zero caso contrário. E o comando regsub substitui as ocorrências de uma expressão regular por um texto substituto.

Para criar expressões regulares usamos os metacaracteres, que são caracteres comuns com significados especiais (., ^, ?, *, +, { etc).

Os metacaracteres são classificados em 4 tipos:

O metacaractere ponto . representa um caractere, seja ele qual for. Por exemplo, a expressão regular .omba combina com: Bomba, bomba, tomba, zomba, ou seja, qualquer coisa que tenha um caractere seguido da seqüência omba. O ponto casa inclusive com o caractere ponto!

A lista [ ] define uma sequência de caracteres dentro de colchetes. Por exemplo a expressão regular p[ri]a combina com: pra, pia, ou seja, qualquer palavra que comece com "p", termine com "a" e tenha as letras "r" ou "i" entre as letras "p" e "a".

A lista negada especifica os caracteres que não devem combinar com o texto. Por exemplo, a expressão regular p[^ri]a combina com qualquer palavra que comece com p, termine com a e não tenha as letras r ou i entre as letras p e a.

O metacaractere ?, chamado de opcional, determina que o caractere anterior a ele pode combinar zero ou 1 vez. Por exemplo, a expressão sai? combina com sa ou sai.

Podemos associar um metacaractere quantificador a um representante. Por exemplo, a expressão regular sa.? combina com qualquer sequência que comece com sa seguida ou não de qualquer caractere: sa, sai, sal, sa#, sa., etc.

O metacaractere asterisco * representa zero, 1 ou mais ocorrências do caractere anterior. Por exemplo, a expressão regular sai* combina com sa, sai, saii, saiiiii....

Combinando um quantificador com um representante. A expressão: sa.* combina com sa, sai, saii, saiiiiiiii, saleiro, salgado, sapo etc, ou seja, qualquer caractere em qualquer quantidade.

O metacaractere + determina que o caractere anterior a ele pode combinar uma ou mais vezes. Mas não é possível ter zero ocorrência do caractere anterior Por exemplo, a expressão 9+1 combina com 91, 9999991, mas não combina com 1.

O metacaractere {} permite especificar o número exato de ocorrências do caractere anterior, ou então uma quantidade mínima ou máxima de ocorrências do caractere anterior. Por exemplo:

Por exemplo, a expressão 6{1,3} combina somente com 6, 66 ou 666.

Os metacaracteres do tipo âncora (^, $ e \b) apenas marcam uma posição específica em uma linha. Eles não podem ser quantificados e, portanto, os metacaracteres quantificadores (?, *, + e {) não surtem qualquer efeito sobre eles.

Dica

O meta caractere circunflexo ^ marca o início de uma linha.

Por exemplo, a expressão regular: ^#.* combina com qualquer linha que se inicia com um caracter tralha # seguido de zero, 1 ou mais ocorrências de qualquer caractere.

Pode ser útil para remover as linhas de comentários de um script ou de um arquivo de configuração, que são iniciadas por #.

O comando seguinte remove todas as linhas de comentário de um arquivo:

regsub -all -line {^#.*} $arquivo ""

E o comando seguinte remove todas as linhas em branco de um arquivo:

regsub -all -line {^\n} $arquivo ""

O metacaractere cifrão $ especifica o final de uma linha. Por exemplo, a expressão regular [0-9]+$ combina com uma ou mais ocorrências de números no intervalo de 0 a 9 que esteja no final de uma linha.

Os outros metacaracteres que não são quantitativos, representativos ou âncoras, servem para refinar o controle das expressões regulares.

O metacaractere escape \ é usado quando queremos especificar um caractere literal. Por exemplo, a expressão regular: P\? combina com o caractere P seguido do caractere interrogação ? e não o metacaractere quantificador opcional ?.

O metacaracter OU | permite especificar sequências possíveis para uma determinada posição. Ex: dia|noite, pode combinar com dia OU noite.