Duvida com o metodo matches da classe String

Eu entendi o que faz o metodo matches, mas eu quero saber como faco para que o metodo nao faca diferenca entre maiuscula e minuscula
ex:>
String teste=“abc”;
teste.matches(“AbC”);==> Esta linha deve ser true

como eu faco?

// Maneira 1
 String teste="abc";
if (teste.matches("(?i)AbC")) {
    ....
};
// Maneira 2 - mais simples
 String teste="abc";
if (teste.toLowerCase().matches("abc")) {
    ....
};

vc poderia me explicar como funciona esta maneira 1?
“(?i)AbC”
o que significa isso?