Aspectos negativos de la expresión regular: solo una aparición - Java

Estoy tratando de encontrar si una cadena contienesolo uno aparición de una palabra,

p.ej.

String : `jjdhfoobarfoo` , Regex : `foo` --> false

String : `wewwfobarfoo` , Regex : `foo` --> true

String : `jjfffoobarfo` , Regex : `foo` --> true

múltiplefoo's puede ocurrir en cualquier parte de la cadena, por lo que pueden ser no consecutivos,

Pruebo la siguiente expresión regular de expresiones regulares en java con cadenafoobarfoo, pero no funciona y vuelvecierto :

static boolean testRegEx(String str){
    return str.matches(".*(foo)(?!.*foo).*");
}

Sé que este tema puede parecer duplicado, pero me sorprende porque cuando uso esta expresión regular:(foo)(?!.*foo).* funciona !

¿Alguna idea de por qué sucede esto?

Respuestas a la pregunta(5)

Su respuesta a la pregunta