Se volevi solo trovare le occorrenze di [ ..... ] allora sì, basta 1 regex e il find().
Comunque la tua espressione non è correttissima. È più corretta:
"\\[([^\\]]+)\\]"
Il ^ all'inizio di una "classe" di caratteri [ ] serve a negare il senso. Quindi [^X]+ vuol dire una sequenza di 1 o più caratteri che non contiene X. In una sequenza ABCRGXFRG matcha solo ABCRG.
Pertanto la regex pura [^\]]+ vuol dire una sequenza che non contiene ']'. Questo serve per trovare più velocemente il ] di terminazione del tuo pattern, evitando che il motore delle regex vada a "consumare" subito tutto l'input causando poi backtracking se avessi usato es. .*
Insomma, è una ottimizzazione.