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!