terça-feira, 17 de janeiro de 2012

Expressões Regulares VII

Para finalizar este assunto de quantificadores temos que explicar os tais tipos: GreedyReluctantPossessive. Vamos ver:
  • Greedy: estes quantificadores forçam a procura a ler toda a string antes de tentar localizar o primeiro resultado. Se a primeira tentativa (toda string) falha, a pesquisa fornece um caracter e tenta novamente, repetindo o processo até achar ou que não hajam mais caracteres. Dependendo do quantificador, a última tentativa será com 1 ou zero caractere.
  • Reluctant: este tipo de quantificador faz uma busca ao contrário do Greedy. Começa pela menor string possível (0 ou 1 caracter dependendo o outro quantificador) até tentar com a string completa.
  • Possessive: processam toda a string e tentam achar a sequência pesquisada somente uma vez (e não mais).

Vamos considerar os exemplos rodados acima.

Com .*casa o matcher irá procurar qualquer caracter que apareçam zero ou mais vezes seguida pela palavra casa. Como * é um quantificador do tipo Greedy. O programa irá tentar consumir toda a string  primeiro - irá tentar achar algo + casa, mas como tudo foi consumido, não acha nada. O programa irá colocar para pesquisa a letra mais a direita da string original - a - e realiza a pesquisa com ela. Também não acha. Esta pesquisa vai expandindo até o programa ter expandido para os 4 caracteres da direita que fornecem casa, que equivale a zero caracteres + casa, portanto a pesquisa para.

O segundo exemplo que é reluctant e portanto funciona o contrário. Assim a pesquisa começa com a string completa e tentar achar algo + casa, e acha o primeiro resultado indicado. O matcher remove o caracter mais a esquerda, resultando na string casaaaaaaaaaacasa e faz novo teste, não achando resultado. A string é sistematicamente reduzida até acasa, quando o teste consegue localizar novamente a string pesquisada. Para esclarecer veja abaixo:
Um pouco menos confuso?

Retornamos ao terceiro quantificador - possessive. Como a string é consumida na primeira tentativa, não acha resultado. A Oracle recomenda que somente utilizemos este tipo de pesquisa, quando queremos achar toda a string de uma só vez.



E para terminar este post vamos tratar das expressões de fronteira. As expressões que utilizamos até agora localizavam um conjunto de caracteres em qualquer posição da string, sem se importar com onde este conjunto estava localizado. A utilização destas expressões de fronteira permitem que tentemos localizar um conjunto de caracteres, mas somente se estiver no início ou final da linha e assim por diante.

As principais expressões são:


Expressão
Regex
Significado
^representa o início da linha
$representa o final da linha
\brepresenta uma palavra
você se lembra [a-zA-Z0-9]
\Brepresenta uma fronteira que não é palavra
é o contrário de \b
\Arepresenta o início da entrada
\Grepresenta o final da última sequência encontrada
\Zrepresenta o final da entrada
\zrepresenta o final da entrada

Vamos tentar uns exemplos:

O primeiro exemplo não achou, pois a string não começa com pedra, enquanto o segundo exemplo funciona, pois a frase começa com No. O terceiro exemplo também acha, pois a frase termina com pedra. A última também acha 4 ocorrências de pedra que estão no texto.

Para finalizar este post vamos tentar com \b e \B:


Nenhum comentário:

Postar um comentário