Vamos agora abordar os metacaracteres tipo âncora. Inicialmente, por que a nomenclatura âncora? Porque eles não definem caracteres ou casam quantidades, no lugar disso eles marcam uma posição específica na linha. Veremos o primeiro metacaractere-âncora, que é o circunflexo.

^[0-9] buscamos linhas que começam com números. Observe o código.


        Pattern p = Pattern.compile(“^[0-9].*”);

        Matcher m = p.matcher(“787Devmedia”);

        Saída:

        Padrão: ^[0-9]

        0 787Devmedia
        

^[^0-9] buscamos linhas que não começam com números. O 1º circunflexo é a âncora e o 2º é a negação da lista.

Complementar e semelhante ao circunflexo, o cifrão marca o fim de uma linha e só é válido no fim da expressão. Como o exemplo acima, [0-9]$ combina com linhas finalizadas com um número.

Agora que vimos um pouco mais sobre regex, os códigos de exemplo farão bem mais sentido. Eis um exemplo mais complexo de uma fonte e de uma expressão:


        Pattern p = Pattern.compile(“aba”);

        Matcher m = p.matcher(“abababa”);
        

Quantas ocorrências temos neste trecho de código? Normalmente existe uma ocorrência começando na posição 0 e outra na posição 4. Mas e quanto àquela na posição 2? Geralmente no mundo regex, a String aba, que começa na posição 2, não será avaliada como uma ocorrência válida. A 1ª regra de busca regex é: uma busca regex é executada da esquerda para direita e, logo após um caractere da fonte tenha sido utilizado em uma ocorrência, ele não pode mais ser reutilizado.

Busca Usando Metacaracteres


        Pattern p = Pattern.compile(“\\d”);

        Matcher m = p.matcher(“aaa1x2y3”);
        

Regex nos diria que achou digitos nas posições: 3 5 7

Regex permite um rico conjunto de metacaracteres que podemos encontrar descritos na documentação API para java.util.regex.Pattern. Não veremos todos aqui, entretanto descreveremos aqueles que serão necessários para o exame.

  • \d Um dígito
  • \s Caractere de espaço em branco
  • Pattern p = Pattern.compile(“\\s”);
  • Matcher m = p.matcher(“aaa 1x2 y3”);
  • Retorna os indices 3 7

  • \w Caractere de palavra, que pode ser dígito, letra ou underscore _
  • Pattern p = Pattern.compile(“\\w”);
  • Matcher m = p.matcher(“x 45 _A”);
  • Retorna os indices 0 2 3 5 6

Também é possível especificar um conjunto de caracteres a serem procurados utilizando colchetes; e intervalos de caracteres a serem procurados usando colchetes e um hífen.

  • [def] Procura apenas por d’s, e’s ou f’s
  • [b-e] Procura apenas pelos caracteres b, c, d ou e.

Na continuação veremos Tokenização.


Leia todos artigos da série