regex

REGEX(7)                Miscellaneous Information Manual                REGEX(7)



NOME
       regex - expressões regulares do POSIX 1003.2

DESCRIÇÃO
       Expressões regulares (ERs), como definidas no POSIX 1003.2, vêm em duas
       formas: REs modernas (grosseiramente, aquelas de egrep; o 1003.2 chama
       essas de ERs "estendidas" ERs) e ERs obsoletas (grosseiramente, aquelas
       de ed(1); REs "básicas" do 1003.2).  REs obsoletas existem principalmente
       por causa de compatibilidade retrógrada em alguns programas antigos; eles
       serão discutidos no final. O 1003.2 deixa alguns aspectos da sintaxe e da
       semântica das ERs em aberto; portáveis para outras implementações do
       1003.2.

       Uma (moderna) ER é uma† ou mais† ramificações† não-vazias† , separadas
       por '|'.  Ele encontra tudo o que casa com uma das ramificações.

       Uma ramificação é um† ou mais pedaços, concatenados.  Ele encontra um
       casamento para o primeiro, seguido por um casamento para o segundo, etc.

       Um pedaço é um átomo possivelmente seguido por um † '*', '+', Um átomo
       seguido por '*' encontra uma sequência de 0 ou mais casamentos do átomo.
       Um átomo seguido por '+' encontra uma sequência de 1 ou mais casamentos
       do átomo.  Um átomo seguido por '?' encontra uma sequência de 0 ou 1
       casamento do átomo.

       Uma composição é '{' seguido por um inteiro decimal sem sinal,
       possivelmente seguido por ',' , possivelmente  seguido por outro inteiro
       decimal sem sinal, sempre seguido por '}'.  Os inteiros devem estar entre
       0 e RE_DUP_MAX (255†) inclusive, e se houver dois deles, o primeiro e não
       pode exceder o segundo.  Um átomo seguido por uma composição contendo um
       inteiro i, sem vírgula, encontra uma sequência de i ou mais casamentos do
       átomo.  Um átomo seguido por uma composição contendo dois inteiros i
       encontra uma sequencia de um mais i casamentos do átomo.  Um átomo
       seguido por uma composição contendo dois inteiros i e j encontra uma
       sequência de i até j (inclusive) casamentos do átomo.

       Um átomo é uma expressão regular englobada em '()' (encontrando um
       casamento para a expressão regular), um conjunto vazio de '()'
       (encontrando a string nula)†, uma expressão agrupada (ver abaixo), '.'
       (encontrando qualquer caractere simples), '^' (encontrando a string nula
       no começo de uma linha), '$' (encontrando a string nula no fim de uma
       linha), um '\' seguido de um dos caracteres (encontrando aquele caractere
       tomado como um caractere ordinário), um '\' seguido por qualquer outro
       caractere† (encontrando aquele caractere tomado como um caractere
       ordinário, como se o '\' não estivesse presente†), ou um caractere
       simples se outro significado (encontrando qualquer caractere).  Um '{'
       seguido por um caractere diferente de um dígito é um caractere ordinário,
       não o início de uma composição†.  É ilegal terminar uma ER com '\'.

       Uma expressão agrupada é uma lista de caracteres englobados por um '[]'.
       Ele normalmente encontra qualquer caractere simples da lista (mas veja
       abaixo).  Se a lista começa com '^', ele encontra qualquer caractere
       simples (mas veja abaixo) que não venha do resto da lista.  Se dois
       caracteres na lista são separados por '-', isto é uma abreviação para a
       range completa de caracteres entre aqueles dois (inclusive) na sequência
       de combinação, por exemplo, '[0-9]' em ASCII encontra qualquer dígito
       decimal.  É ilegal † que duas faixas compartilhem um ponto final, por
       exemplo, 'a-c-e'.  As faixas são muito dependentes de sequência de
       combinação, e programas portáveis devem evitar confiar nelas.

       Para incluir um literal ']' na lista, torne-o o primeiro caractere
       (seguindo um possível '^').  Para incluir um literal '-', torne-o o
       primeiro ou o último caractere, ou o segundo ponto final da faixa.  Para
       usar um literal '-' como o primeiro ponto final da faixa, englobe-o entre
       '[.' e '.]' para torná-lo um elemento de combinação (veja abaixo).  Com a
       exceção destas e algumas combinações usando '[' (veja os próximos
       parágrafos), todos os outros caracteres especiais, incluindo '\', perdem
       seu significado especial dentro de uma expressão agrupada.

       Dentro de uma expressão agrupada, um elemento de combinação (um
       caractere, uma sequência multi-caractere que combina como se fosse um
       caractere simples, ou um nome de sequência de combinação se for o caso)
       englobado entre '[.' e '.]' significa a sequência de caracteres daquele
       elemento de combinação.  A sequência é um elemento simples de uma lista
       de expressões agrupada.  Uma expressão agrupada contendo um elemento de
       combinação multi-caractere pode, portanto, encontrar mais de um
       caractere, por exemplo, se a sequência de combinação inclui um elemento
       de combinação 'ch', então a ER '[[.ch.]]*c' encontra os primeiros cinco
       caracteres de 'chchcc'.

       Dentro de uma expressão agrupada, um elemento de combinação englobado por
       '[=' e '=]' é uma classe equivalente, que significa uma sequência de
       caracteres com todos os elementos de combinação equivalentes a aquele,
       incluindo ele mesmo.  (Se não houver outro elemento de combinação
       equivalente, o tratamento é como se os delimitadores fossem '[.' e '.]'.)
       Por exemplo, se o e ^ são os membros de uma classe equivalente, então
       '[[=o=]]', '[[=^=]]', e '[o^]' são todos sinônimos.  Uma classe
       equivalente não pode † ser um ponto final de uma faixa.

       Dentro de uma expressão agrupada, o nome de uma classe de caractere
       englobado por '[:' e ':]' significa a lista de todos os caracteres
       pertencente àquela classe.  Os nomes padrão de classes de caracteres são:

              alnum       digit       punct
              alpha       graph       space
              blank       lower       upper
              cntrl       print       xdigit

       Isto vale para as classes de caracteres definidas em ctype(3).  Um locale
       pode fornecer outros.  Uma classe de caracteres não pode ser usada como
       um ponto final de uma faixa.

       Há dois casos especiais de expressões de colchetes: as expressões
       '[[:<:]]' e '[[:>:]]' casam com a string nula no início e no fim de uma
       palavra, respectivamente.  Uma palavra é definida como uma sequência de
       caracteres de palavras que não é precedida e nem seguida por caracteres
       de palavra.  Um caractere de palavra é um caractere alnum (como definido
       por ctype(3)) ou um sublinhado.  Esta é uma extensão, compatível mas não
       específica do POSIX 1003.2, e deve ser usada com cautela em softwares que
       pretendem ser portáveis para outros sistemas.

       Em um evento em que uma ER encontraria mais de uma substring de uma
       string dada, a ER encontra aquela que inicia mais próxima do início da
       string.  Se a ER pode encontrar mais que uma substring começando naquele
       ponto, ela encontra a mais longa.  Sub-expressões também podem encontrar
       a substring mais longa possível, sujeitando-se à limitação de o casamento
       todo ser tão longo quanto possível, com sub-expressões iniciando primeiro
       na ER tendo prioridade sobre aquelas iniciando posteriormente.  Note que
       sub-expressões de nível mais alto, portanto, têm prioridade sobre suas
       sub-expressões componentes de nível mais baixo.

       Os comprimentos dos casamentos são medidos em caracteres, e não em
       elementos de combinação.  Uma string nula é considerada mais longa do que
       um caso de não se encontrar nada.  Por exemplo, quando '(.*).*' é
       aplicado em 'abc' a sub-expressão entre parênteses casa todos os três
       caracteres, e quando '(a*)*' é aplicado em 'bc' ambas as ERs inteiras e a
       sub-expressão entre parênteses encontram a string nula.

       Se casamento independente da caixa é especificado, o efeito é tal como se
       todas as distinções de caixa sumissem do alfabeto.  Quando um alfabético
       que existe em múltiplos casos aparece como um caractere ordinário fora de
       uma expressão de colchete, é transformado efetivamente em uma expressão
       de colchetes contendo ambos os casos, por exemplo, 'x' se torna '[^xX]'.
       Quando ele aparece dentro de uma expressão de colchetes, todos os casos
       equivalentes a ele são acrescentados à expressão de colchetes, de forma
       que (por exemplo) '[x]' se torna '[xX]' e '[^xX]'.

       Nenhum limite particular é imposto sobre o comprimento das ERs†.
       Programas que pretendem ser portáveis não devem empregar ERs maiores de
       256 bytes, pois uma implementação pode negar-se a aceitar tais ERs para
       continuar compatível com o POSIX.

       Expressões regulares obsoletas ("básicas") diferem em vários aspectos.
       Os sinais '+', '|' e '?' são caracteres ordinários e não há equivalentes
       para suas funcionalidades.  Os delimitadores para composição são '\{' and
       '\}', com '{' e '}' por eles mesmos caracteres ordinários.  Os parênteses
       para sub-expressões aninhadas são '\(' e '\)', com '(' e ')', por eles
       mesmos caracteres ordinários.  O '^' é um caractere ordinário, exceto no
       começo de uma ER ou † no começo de uma sub-expressão com parênteses, o
       '$' é um caractere ordinário, exceto no fim da ER ou † no fim da sub-
       expressão com parênteses, e '*' é um caractere ordinário se ele aparece
       no começo da ER ou no começo de uma sub-expressão com parênteses (depois
       de um possível '^' dianteiro).  Finalmente, há um novo tipo de átomo, uma
       referência para trás: casa com a mesma sequência de caracteres casada
       pela sub-expressão de parênteses (numerando sub-expressões pelas posições
       dos seus parênteses abertos, da esquerda para a direita), tal que (por
       exemplo) '\([bc]\)\1' case com 'bb' ou 'cc', mas não com 'bc'.

VEJA TAMBÉM
       regex(3)

       POSIX 1003.2, seção 2.8 (Notação de Expressão Regular).

PROBLEMAS
       Ter dois tipos de ERs é uma devastação.

       A especificação corrente do 1003.2 diz que ')' é um caractere ordinário
       na ausência de um '(' não casado; este era um resultado não-intencional
       de um erro de palavreamento, e mudanças são parecidas.  Evite confiar
       nela.

       Referências para trás são uma destruição terrível, causando problemas
       sérios em implementações eficientes.  Elas também são definidas um pouco
       vagamente (fazendo Evite usá-las.

       A especificação 1003.2 para casamentos independentes de caixa é vaga.  A
       definição "um caso implica em todos os casos" dada acima é um consenso
       corrente entre implementadores como a interpretação correta.

       A sintaxe para os limites de palavra é incrivelmente feia.

AUTOR
       Esta página foi tomada do pacote regex de Henry Spencer.

TRADUZIDO POR LDP-BR em 21/08/2000.
       Rubens de Jesus Nogueira <darkseid99@usa.net> (tradução) André L. Fassone
       Canova <lonelywolf@blv.com.br> (revisão)



                                   07/02/1994                           REGEX(7)