JavaRush /Blogue Java /Random-PT /Noções básicas de expressões regulares em Java. Parte 3
articles
Nível 15

Noções básicas de expressões regulares em Java. Parte 3

Publicado no grupo Random-PT
Vamos continuar nosso estudo sobre expressões regulares. Neste artigo veremos classes de caracteres predefinidas, bem como quantificação (busca de sequências). Noções básicas de expressões regulares em Java.  Parte 3 - 1

Classes de caracteres predefinidos

A API de classe Patterncontém classes de caracteres predefinidas que oferecem atalhos convenientes para expressões regulares comumente usadas. Noções básicas de expressões regulares em Java.  Parte 3 - 2Nesta tabela, as construções na coluna da esquerda são representações abreviadas das expressões na coluna da direita. Por exemplo, \dsignifica um número (0-9), \wsignifica 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 \Qe \Eusá-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: Noções básicas de expressões regulares em Java.  Parte 3 - 3Noções básicas de expressões regulares em Java.  Parte 3 - 4Nos 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

Noções básicas de expressões regulares em Java.  Parte 3 - 4Os 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ções básicas de expressões regulares em Java.  Parte 3 - 5No 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: Noções básicas de expressões regulares em Java.  Parte 3 - 6todos 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": Noções básicas de expressões regulares em Java.  Parte 3 - 7Expressã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": Noções básicas de expressões regulares em Java.  Parte 3 - 8O 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: Noções básicas de expressões regulares em Java.  Parte 3 - 9A 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: Noções básicas de expressões regulares em Java.  Parte 3 - 10Para 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: Noções básicas de expressões regulares em Java.  Parte 3 - 11Neste 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.

Usando grupos e classes de caracteres com quantificadores

Até este ponto, testamos quantificadores em strings contendo o mesmo caractere. Os quantificadores se aplicam apenas a um único caractere, portanto, a expressão regular "abc+" corresponderá a strings contendo "ab" e "c" uma ou mais vezes. Não significará “abc” uma ou mais vezes. Mas quantificadores podem ser usados ​​em conjunto com grupos e classes de caracteres, como [abc]+ (a ou b ou c, uma ou mais vezes) ou (abc)+ (“abc” uma ou mais vezes). Vamos encontrar um grupo de caracteres (cachorro), três vezes seguidas: Noções básicas de expressões regulares em Java.  Parte 3 - 12No primeiro exemplo, o programa encontra uma correspondência, porque o quantificador se estende a um grupo de caracteres. Se você retirar os colchetes, o quantificador {3} será aplicado apenas à letra “g”. Você também pode usar quantificadores com classes de caracteres: Основы регулярных выражений в Java. Часть 3 - 13O quantificador {3} aplica-se à classe de caracteres entre colchetes no primeiro exemplo, e no segundo - apenas ao caractere “c”.

Diferenças entre quantificadores gananciosos, preguiçosos e excessivamente gananciosos

Existem pequenas diferenças entre quantificadores gananciosos, relutantes e possessivos. Os quantificadores gananciosos são assim chamados porque tentam encontrar a correspondência mais longa possível: o programa primeiro tenta "comer" a string inteira, se uma correspondência não for encontrada, um caractere é descartado e a pesquisa é repetida até que uma correspondência seja encontrada ou não restam mais caracteres. Os preguiçosos, por outro lado, começam no início da linha, adicionando caractere após caractere até encontrarem uma correspondência. Finalmente, a quantificação ciumenta varre toda a string uma vez, sem remover caracteres como na gananciosa. Para demonstração, usaremos a string xfooxxxxxxfoo. Основы регулярных выражений в Java. Часть 3 - 14O primeiro exemplo usa o quantificador ganancioso .* para encontrar qualquer caractere, 0 ou mais vezes, seguido pelos caracteres "f" "o" "o". Como o cantificador é ganancioso, a correspondência encontrada contém a string inteira. Um quantificador ganancioso não encontrará todas as correspondências em uma string porque na primeira etapa, após escanear toda a string, ele encontrará uma correspondência e finalizará o trabalho. O segundo exemplo é preguiçoso e começa do início da linha, adicionando caractere por caractere. O programa começa verificando “vazio”, mas desde a sequência “foo” não está no início da linha, a busca continua com a adição do caractere “x”, após o qual será encontrada a primeira correspondência entre os índices 0 e 4. A busca continua até o final da linha e a segunda correspondência será encontrada entre os índices 4 e 13. O terceiro exemplo não encontra coincidências porque o quantificador está com ciúmes. Nesse caso, a expressão regular .*+ "comeu" a linha inteira, não deixando nada para "foo". Use o quantificador ciumento quando precisar descartar algo desnecessário em uma string; ele será mais eficaz do que o quantificador ganancioso equivalente. Isso é tudo! Link para a fonte: Noções básicas de expressões regulares em Java. Parte 3
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION