Vamos continuar nosso estudo sobre expressões regulares. Neste artigo veremos classes de caracteres predefinidas, bem como quantificação (busca de sequências).
Classes de caracteres predefinidos
A API de classePattern
contém classes de caracteres predefinidas que oferecem atalhos convenientes para expressões regulares comumente usadas. Nesta tabela, as construções na coluna da esquerda são representações abreviadas das expressões na coluna da direita. Por exemplo, \d
significa um número (0-9), \w
significa qualquer letra maiúscula ou minúscula, sublinhado ou número). Use classes de caracteres predefinidas sempre que possível. Isso tornará seu código mais fácil de ler e corrigir erros. Construções que começam com uma barra invertida são chamadas de escape ou protegidas. Em artigos anteriores, já falamos sobre escapar de caracteres especiais com barras invertidas ou símbolos \Q
e \E
usá-los como caracteres regulares. Se você usar uma barra invertida com caracteres regulares (literais), será necessário escapar da barra invertida para que a expressão seja compilada.
private final String REGEX = "\\d"; // цифра
Neste exemplo \d
, uma expressão regular; a barra invertida adicional é necessária para a compilação do programa. Nosso programa de teste lê expressões regulares diretamente do console, portanto, nenhuma barra adicional é necessária. O exemplo a seguir demonstra o uso de classes de caracteres predefinidas: Nos três primeiros exemplos, a expressão regular é simplesmente " .
" (o caractere especial ponto), que significa qualquer caractere. Portanto, a busca foi bem sucedida em todos os casos. Outros exemplos usam classes de caracteres predefinidas, cujos significados discutimos na tabela acima.
Quantificadores
Os quantificadores permitem especificar o número de ocorrências de um caractere em uma string. Vamos dar uma olhada mais de perto nas complexidades de como funcionam os quantificadores gananciosos, preguiçosos e muito gananciosos. À primeira vista pode parecer que os quantificadores X?, X?? e X?+ funcionam da mesma maneira: “X está presente uma vez ou não está presente”. Existem pequenas diferenças na implementação desses quantificadores, que veremos a seguir.Correspondências de comprimento zero
Vamos começar com o ganancioso. Vamos escrever três expressões regulares diferentes: a letra “a” com caracteres especiais ?, * ou +. Vejamos o que acontece se testarmos essas expressões regulares em uma linha vazia: No exemplo acima, a busca foi bem-sucedida nos dois primeiros casos, pois as expressões a? e a* permitem que o caractere a esteja faltando na string. Observe também que o índice de início e de última correspondência são iguais (0). Como a string de entrada não tem comprimento, o programa não encontra nada :) na primeira posição. Este caso é chamado de correspondência de comprimento zero. Essas correspondências ocorrem em vários casos: quando a linha de entrada está vazia, no início da linha de entrada, após o último caractere da linha ou entre caracteres da linha. As partidas de comprimento zero são fáceis de detectar: elas começam e terminam na mesma posição. Vejamos mais alguns exemplos de correspondências de comprimento zero. Vamos explorar as correspondências de comprimento zero com mais alguns exemplos. Vamos mudar a string de entrada para o caractere "a" e observar um efeito interessante: todos os três quantificadores encontraram o caractere "a", mas os dois primeiros, que permitem a ausência de um caractere, encontraram uma correspondência de comprimento zero na posição 1 - após o último caractere da string. Isso acontece porque o programa trata o caractere “a” como uma string e “percorre” através dele até que não haja mais correspondências. Dependendo do quantificador utilizado, o programa encontrará ou não "nada" no final da string. Agora vamos alterar a string de entrada para uma sequência de cinco letras "a": Expressão regular a? encontra uma correspondência para cada letra da string separadamente. A expressão a* encontra duas correspondências: a sequência de caracteres "a"' e uma correspondência de comprimento zero na posição 5. E finalmente, a expressão regular a+ encontra apenas a sequência de caracteres “a”, sem encontrar “nada” :) O que acontecerá se uma string contendo caracteres diferentes for dada como entrada? Por exemplo, "ababaaaab": O caractere "b" está nas posições 1, 3 e 8 e o programa encontra correspondências de comprimento zero nessas posições. Expressão regular um? não presta atenção em “b”, mas simplesmente procura a presença (ou ausência) do caractere “a”. Se o quantificador permitir a ausência de "a", todos os caracteres na string diferentes de "a" serão mostrados como uma correspondência de comprimento zero. Para encontrar sequências de um determinado comprimento, basta especificar o comprimento entre chaves: A expressão regular a{3} procura uma sequência de três caracteres "a". Nada foi encontrado na primeira linha porque não havia a's suficientes na linha. O segundo contém 3 caracteres, que o programa encontra. O terceiro teste também encontra uma correspondência no início da string. Tudo após o terceiro caractere não satisfaz a expressão regular, no código abaixo sim e haverá várias correspondências: Para especificar o comprimento mínimo da sequência, use:Enter your regex: a{3,}
Enter input string to search: aaaaaaaaa
I found the text "aaaaaaaaa" starting at index 0 and ending at index 9.
Neste exemplo, o programa encontra apenas uma correspondência porque a sequência atende ao requisito mínimo de comprimento de sequência de (3) caracteres "a". Finalmente, definindo o comprimento máximo da sequência: Neste exemplo, a primeira correspondência terminou no sexto caractere. A segunda correspondência contém caracteres após a sexta, porque eles satisfazem o requisito de comprimento mínimo. Se a string tivesse um caractere menor, não haveria segunda correspondência.
GO TO FULL VERSION