Estou tentando entender a diferença entre matches()
e find()
.
De acordo com o Javadoc, (pelo que entendi), matches()
procurará a string inteira, mesmo que encontre o que está procurando, e find()
parará quando encontrar o que está procurando.
Se essa suposição estiver correta, não consigo ver sempre que você deseja usar em matches()
vez de find()
, a menos que queira contar o número de correspondências encontradas.
Na minha opinião, a classe String deve ter, em find()
vez de matches()
um método embutido.
Então, para resumir:
- Minha suposição está correta?
- Quando é útil usar em
matches()
vez defind()
?
find()
várias vezes pode retornar resultados diferentes para o mesmoMatcher
. Veja minha resposta abaixo.Respostas:
matches
tenta combinar a expressão com toda a cadeia e adicionar implicitamente um^
no início e$
no final do seu padrão, o que significa que ele não procurará uma substring. Daí a saída deste código:123
é uma substring de,a123b
portanto, ofind()
método gera true.matches()
apenas 'vê'a123b
que não é o mesmo que123
e, portanto, gera falso.fonte
matchers()
não é simplesmente umfind()
com implicado ^ e $. Lembre-se de que ligar.find()
mais de uma vez pode ter resultados diferentes se não for precedido porreset()
, enquantomatches()
sempre retornará o mesmo resultado. Veja minha resposta abaixo.matches
return true se a string inteira corresponder ao padrão especificado.find
tenta encontrar uma substring que corresponda ao padrão.fonte
matches(p)
é o mesmo comofind("^" + p + "$")
se isso fosse mais claro."123abc123".matches("[a-z]+")
falhará exatamente como"123abc123".find("^[a-z]+$")
faria. Meu argumento foi que issomatches()
vale para uma partida completa, assim comofind()
nas âncoras de início e de fim.Pattern.compile("some pattern").matcher(str).matches()
é igual aPattern.compile("^some pattern$").matcher(str).find()
...("some pattern").matcher(str).matches()
é exatamente igual ao que é verdadeiro apenas na primeira chamada. Veja minha resposta abaixo....("^some pattern$").matcher(str).find()
matches()
retornará true somente se a string completa for correspondida.find()
tentará encontrar a próxima ocorrência dentro da substring que corresponde ao regex. Observe a ênfase no "próximo". Isso significa que o resultado da chamadafind()
várias vezes pode não ser o mesmo. Além disso, usandofind()
você pode chamarstart()
para retornar a posição em que a substring foi correspondida.Saída:
Portanto, tenha cuidado ao chamar
find()
várias vezes se oMatcher
objeto não tiver sido redefinido, mesmo quando o regex estiver cercado^
e$
corresponder à seqüência completa.fonte
find()
considerará a sub-string contra a expressão regular, onde asmatches()
considerará a expressão completa.find()
retornará true somente se a sub-string da expressão corresponder ao padrão.fonte
matches();
não faz buffer, masfind()
buffers.find()
procura no final da string primeiro, indexa o resultado e retorna o valor booleano e o índice correspondente.É por isso que quando você tem um código como
Em 4: o mecanismo regex usando a estrutura padrão lerá todo o seu código (indexe para indexar conforme especificado por
regex[single character]
para encontrar pelo menos uma correspondência. Se essa correspondência for encontrada, ela será indexada, o loop será executado com base em o resultado indexado, caso contrário, se não fizesse o cálculo antecipado, como o quematches()
não faz. A instrução while nunca seria executada, pois o primeiro caractere da sequência correspondente não é um alfabeto.fonte