Expressão regular para selecionar palavra inteira e case sensitive em palavra acentuada

Estou com um pequeno problema com um RegEx.

Preciso fazer um programa que pesquise uma determinada palavra em um conjunto de textos e grife a palavra pesquisada no meio do texto.

Para isso desenvolvi o seguinte método:

public void grifarTexto(Relato relato, String texto) {
	relato.setDescricaoRelato(relato.getDescricaoRelato().replaceAll("(?i)(" + texto + ")", "<mark>$1</mark>"));
}

Porém ai surgiram dois probleminhas…

1º Gostaria que ele pegasse a palavra inteira, porém quando colocos os caracteres de marcação de inicio (^) e fim ($), ele acaba não grifando nenhuma parte do texto.

Método utilizado:

public void grifarTexto(Relato relato, String texto) {
	relato.setDescricaoRelato(relato.getDescricaoRelato().replaceAll("(?i) ^(" + texto + ")$", "<mark>$1</mark>"));
}

2º Ele está ignorando os caracteres maísculo e minusco das palavra corretamente, salvo quando tem acento.
Por exemplo: Quando pesquiso pela palavra mão

MÃO (não grifa)
mão (grifa)
mÃo (não grifa)
MãO (grifa)

Ou seja ele não ignora os caracteres maísculo e minusco de letras acentuadas.

Fiz testes dessas expressões no site Rubular para ver se estavam corretas e pelo retorno do site aparenta estar ok.
Links com os testes: http://rubular.com/r/YRcTJBn8eY e http://rubular.com/r/dh753n4mgl

Alguém sabe qual a expressão regular que eu devo usar para conseguir fazer as validações que eu desejo?