sexta-feira, 13 de janeiro de 2012

Expressões Regulares V

Vamos ver agora algo bastante difícil de lembrar - são os qualificadores nas expressões regex.

GreedyReluctantPossessiveSignificado
x?x??x?+acha x, se aparece uma vez ou nenhuma
x*x*?x*+acha x, se aparece zero ou mais vezes
x+x+?x++acha x, se uma ou mais vezes
x{n}x{n}?x{n}+acha x, se exatamente n vezes
x{n,}x{n,}?x{n,}+acha x, se pelo menos n vezes
x{n,m}x{n,m}?x{n,m}+acha x, se pelo menos n vezes, mas não mais que m vezes

Fácil? Também acho complicado.
Primeiro fato o tipo do qualificador é dado pelo sufixo. Vamos voltar na tabela acima. Todos os qualificadores greedy não tem um sufixo especial, os qualificadores reluctant tem uma interrogação no final e os possessive tem um sinal de mais no final.

Vamos testar uma pesquisa do caracter a, com algumas variações para ver se conseguimos entender:

No caso da string pesquisada estar vazia, vemos que a? e a* retornam resultados. Por quê? Se lemos a definição, estas duas opções retornam quando existem zero ocorrências do caracter procurado - daí o resultado de ter encontrado na posição zero. Como a string é nula, a+ não encontra, afinal não tem nada para ser encontrado e é necessária pelo menos uma ocorrência.

Quando colocamos um único a na string pesquisada, os resultados são diferentes.  Vemos que a? e a* retornam os mesmos resultados. Apesar disto os motivos são diferentes, a? retorna dois resultados, porque só existem 2 resultados possíveis: o caracter só aparece uma vez (afinal a string só tem uma letra a) e o resultado para nenhum vez. Desta vez a+ já retorna um resultado, pois a letra aparece uma (única) vez.

Quanto a string pesquisada é aaa, os resultados são ainda mais inusitados. a? divide a string em 4 blocos, são as três ocorrências da letra procurada e o final. a* acha 2 blocos, um composto pelo conjunto das letras repetidas e um vazio. a+ acha somente o bloco com as letras repetidas.

Vejam o resultado a seguir. Ficou mais fácil de entender?


Continua na 6ª parte deste post.

Nenhum comentário:

Postar um comentário