Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Classe Scanner - delimitador

Lendo a documentação, vi alguns símbolos que entendi que são chamados de delimitadores (\d, \s, \d+, \w), correto? Mas não entendi exatamente o que cada um faz ou a diferença de um \d para um \d+, por exemplo. Na documentação sobre Regex (https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html), também não consegui tirar minha dúvida, há algum outro documento que eu possa consultar?

O exemplo na documentação:

String input = "1 fish 2 fish red fish blue fish";
     Scanner s = new Scanner(input);
     s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
     MatchResult result = s.match();
     for (int i=1; i<=result.groupCount(); i++)
         System.out.println(result.group(i));
     s.close();
5 respostas

Olá Bruna, tudo bem ?

Na própria documentação apontada existe um sumário com os delimitadores e o que eles representam. Procure pelo trecho Summary of regular-expression constructs no documento.

O \d por exemplo ele demonstra que representa um dígito: \d A digit: [0-9]. Imagino que d+ envolva a ideia de digito positivo.

Procurando por outras fontes vi dois outros materiais que podem ajudar.

Um é uma documentação/tutorial (não no padrão Javadoc) no próprio site da Oracle -> https://docs.oracle.com/javase/tutorial/essential/regex/

Outro é um post bem grande que é um guia para regex com Java -> http://www.baeldung.com/regular-expressions-java

Espero ter ajudado. Abraço!

Rafael,

Bom dia. Tudo bem e você? Obrigada pela resposta. Na minha pergunta não sai as duas barras invertidas, sai apenas uma - mas já vi no material que você mandou que são duas para afeito de compilação :). Eu vi o sumário que você mencionou, mas acontece que na minha ignorância (não sou da área de tecnologia, apenas uma curiosa, não fez o menor sentido esse digit [0-9] no código de exemplo, não consegui associar uma coisa com a outra. Você poderia explicar o que está acontecendo com esse \d+ no exemplo que mencionei? Onde entra esse dígito positivo? O que está sendo feito ali no código? Ele mostra o resultado do código, então eu sei que ignora a palavra "fish", mas o que acontece ali efetivamente com o \d+ e com o \w+?

Obrigada pelas indicações, já dei uma olhada e explica muitas coisas, quando a gente está começando tudo parece um bicho de sete cabeças, assusta, tem hora que nem sei por onde começar, mas aos poucos começa a fazer sentido.

Abraço!

solução!

Fala Bruna, tudo bem ? =)

No exemplo que comentei: \d - a single digit: [0-9]. Quer dizer o matcher vai coletar dessa string através do método findInLine() um único caracter numérico que ele exemplifica que pode ser qualquer um no intervalo de 0 a 9 [0-9]. Em geral as documentações usam essa forma de intervalo para dizer o que o matcher vai buscar naquele trecho.

Outro exemplo: \w - a word character: [a-zA-Z_0-9] Aqui quer dizer que o matcher vai buscar por um caractere em uma palavra, podendo ser ele de a a z (minúsculos), ou mesmo A a Z (maiúsculos), ou mesmo que seja um dígito [0-9].

o que está acontecendo com esse \d+ no exemplo que mencionei?

Lendo a documentação da oracle vi que esse \d+ (ao contrário do que supus rs) na verdade se refere a quando você quer obter não somente um único dígito [0-9] (a single digit), mas uma sequência de dígitos [0-9]. Exemplo:

Quando temos essa expressão: "(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)"

A saída do código é:

1
2
red
blue

Se fizermos uma alteração para essa expressão: "(\\d) fish (\\d) fish (\\w+) fish (\\w+)" a saída se mantem igual, visto que \d busca um único dígito.

Mas se alterarmos o texto para: "125 fish 200 fish red fish blue fish" e a expressão só com \d, teremos um erro em execução, não existe um único dígito (que é nossa busca), mas uma sequência deles. Nesse sentido se explica a expressão com \d+. Se voltarmos a expressão para "(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)", a saída será:

125
200
red
blue

A questão do \w+ é exatamente a mesma, só que com caracteres em uma palavra. =)

O que está sendo feito ali no código?

No código estamos apenas buscando (querendo extrair) trechos específicos do texto, usando o padrão de regex e o matcher pra isso.

s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
`

Aqui estamos pedindo ao scanner para encontrar no texto que ele se baseia uma sequencia de dígitos inicial, um outra sequência após a palavra fish, uma sequência de caracteres (palavra) depois de outra palavra fish, e novamente uma sequência de caracteres (palavra) depois de outra fish

É importante dizer que o código não visa despresar a palavra fish, ele tem na verdade a ideia oposta coletar (separadamente) os trechos entre a palavra fish. Se trocarmos no texto a palavra fish, não teremos mais o padrão de texto reconhecido pelo matcher e teremos erro em execução.

MatchResult result = s.match();
for (int i=1; i<=result.groupCount(); i++)
    System.out.println(result.group(i));

Aqui pedimos para fazer o match do texto com o padrão, e imprimir cada item encontrado no Match Result.

Espero ter ajudado. Abraço!

Rafael,

Simplesmente perfeito! Se você ajudou??? Nossa, foi uma aula nota mil! Muito obrigada!!! Como te falei, no momento as coisas ainda parecem confusas, mas quando vamos entendendo melhor os conceitos, tudo começa a se encaixar e a fazer sentido. Valeu demais!

Abraço!

Fico agradecido em poder ajudar =).

Abraço e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software