Direi che dovresti provare così:
codice:
s.matches("0*" + n + ".*");
In questo modo recuperi tutte le stringhe che iniziano con un numero arbitrario di zeri (0*), seguite dal numero da te indicato ( n ) seguito da un qualunque altro carattere (.*).
Potresti anche raffinare di più la RegEx, indicando che dopo il numero deve esserci l'underscore:
codice:
s.matches("0*" + n + "_.*");
così da evitare di trovare anche le stringhe che "contengono" il numero indicato, ma non esattamente il numero indicato.
Esempio, se n = 55 la prima RegEx becca anche tutte queste stringhe:
codice:
"0055_pippo.txt"
"0558_pippo.txt"
"5589_pippo.txt"
I caratteri ^ e $ utilizzati, rispettivamente, per indicare l'inizio e la fine della stringa li puoi mettere oppure no (sono facoltativi, in questo caso particolare). Il motivo per cui non funzionava non era il fatto che ^ serve per negare (infatti, serve a negare un gruppo di caratteri se viene usato all'interno delle parentesi quadre, ma questo non è il caso), ma perchè mancava l'indicazione del fatto che la stringa, dopo il numero, doveva essere seguita da qualcos'altro. L'espressione che hai indicato tu funziona solo per stringhe di questo tipo:
codice:
xxx
0xxx
00xxx
000xxx
...
con un numero arbitrario di zeri e un numero alla fine.
PS: le parentesi tonde servono a delimitare i gruppi, ove possibile non usarle.
Ciao.