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:
Representantes - “.”, “[” e “^”
Quantificadores - “?”, “*”, “+”, “{”
Âncoras - “^”, “$”, “\b”
Outros - “\”, “|”, “(”
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:
{1,6} = de uma a seis ocorrências
{2, } = duas ou mais ocorrências
{3} = exatamente 3 ocorrências
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.
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.