Estoy tratando de entender la diferencia entre matches()
y find()
.
Según el Javadoc, (por lo que entiendo), matches()
buscará toda la cadena incluso si encuentra lo que está buscando, y find()
se detendrá cuando encuentre lo que está buscando.
Si esa suposición es correcta, no puedo ver cada vez que quiera usar en matches()
lugar de find()
, a menos que desee contar la cantidad de coincidencias que encuentra.
En mi opinión, la clase String debería tener en find()
lugar de matches()
un método incorporado.
Entonces para resumir:
- ¿Es correcta mi suposición?
- ¿Cuándo es útil usar en
matches()
lugar defind()
?
find()
varias veces puede devolver resultados diferentes para el mismoMatcher
. Vea mi respuesta a continuación.Respuestas:
matches
intenta hacer coincidir la expresión con la cadena completa e implícitamente agrega un^
al comienzo y$
al final de su patrón, lo que significa que no buscará una subcadena. De ahí la salida de este código:123
es una subcadena dea123b
modo que elfind()
método genera verdadero.matches()
solo "ve",a123b
que no es lo mismo123
y, por lo tanto, genera falsofuente
matchers()
no es simplemente unfind()
con envolvente implícito ^ y $. Tenga en cuenta que llamar.find()
más de una vez puede tener resultados diferentes si no está precedido porreset()
, mientrasmatches()
que siempre devolverá el mismo resultado. Vea mi respuesta a continuación.matches
devuelve verdadero si la cadena completa coincide con el patrón dado.find
intenta encontrar una subcadena que coincida con el patrón.fuente
matches(p)
es lo mismo quefind("^" + p + "$")
si fuera más claro."123abc123".matches("[a-z]+")
fallará igual que lo"123abc123".find("^[a-z]+$")
haría. Mi punto fue que eso sematches()
aplica a un partido completo, al igual quefind()
con los anclajes de inicio y final.Pattern.compile("some pattern").matcher(str).matches()
es igual aPattern.compile("^some pattern$").matcher(str).find()
...("some pattern").matcher(str).matches()
es exactamente igual a eso solo es cierto en la primera llamada. Vea mi respuesta a continuación....("^some pattern$").matcher(str).find()
matches()
solo devolverá verdadero si la cadena completa coincide.find()
intentará encontrar la próxima aparición dentro de la subcadena que coincida con la expresión regular. Tenga en cuenta el énfasis en "el próximo". Eso significa que el resultado de llamarfind()
varias veces podría no ser el mismo. Además, mediante el usofind()
puede llamarstart()
para devolver la posición de la subcadena.Saldrá:
Por lo tanto, tenga cuidado al llamar
find()
varias veces si elMatcher
objeto no se restableció, incluso cuando la expresión regular está rodeada^
y$
coincide con la cadena completa.fuente
find()
considerará la subcadena contra la expresión regular donde comomatches()
considerará la expresión completa.find()
will devuelve verdadero solo si la subcadena de la expresión coincide con el patrón.fuente
matches();
no amortigua, perofind()
amortigua.find()
busca primero el final de la cadena, indexa el resultado y devuelve el valor booleano y el índice correspondiente.Es por eso que cuando tienes un código como
A las 4: el motor de expresiones regulares que utiliza la estructura del patrón leerá todo el código (indexar a indexar según lo especificado por
regex[single character]
para encontrar al menos una coincidencia. Si se encuentra dicha coincidencia, se indexará y el bucle se ejecutará en función de el resultado indexado de lo contrario si no hiciera un cálculo anticipado como cuálmatches()
; no. La instrucción while nunca se ejecutaría ya que el primer carácter de la cadena coincidente no es un alfabeto.fuente