quinta-feira, 26 de fevereiro de 2009

Expressão regular: lookahead negativo - testa a não existência de um item

item\@!
passa se o item precedente não existe (não obtém nenhuma ocorrência).

Em 'foobarfoo':

foo\(bar\)\@!
'foo', não seguido de 'bar'.
(qualquer 'foo' não seguido de 'bar')
Obtém somente o 2º foo.

O '\@!' pode causar confusão porque há muitos locais aonde o padrão não passa.

a.*p\@!
'a', seguido de zero ou mais caracteres (o máximo possível), não seguido de 'p'.
Obtém : ap, app, etc.
Pois '.*' consome todos 'p' até o fim-de-linha e 'p\@!' passa pois o fim-de-linha não é 'p'.

a.\{-}p\@!
'a', seguido de zero mais caracteres (o menos possível), não seguido de 'p'.
Obtém: a, ap, app, etc.
Pois '.\{-}' consome todos 'p' até um outro caracter diferente de 'p' (ou o final-de-linha) e 'p\@!' passa pois não há mais 'p' na posição corrente.

if \(\(then\)\@!.\)*$
'if ', seguido de zero ou mais testes de não existência de 'then' (o maximo possível) e zero ou mais caracteres, seguido do fim-de-linha.
Obtém: 'if' sem nenhum 'then' à direita.
O '$' garante que o teste irá até o final da linha, evitando ocorrências parciais que só ignoraram um 'then' à direita.

0 comentários:

Postar um comentário