[Resolvido]ReplaceFirst + regex

Bom dia!
Li o tópico http://www.guj.com.br/java/149224-como-fazer-esse-regex-de-qualquer-caracter
porém continuo não conseguindo fazer o que preciso.
Se alguém puder ajudar por favor.
Meu problema, resumindo, é o seguinte:
Receberei um texto que pode conter valores com qualquer caracteres entre os delimitadores <% e %>.
Preciso obter esses valores, que serão uma chave em um properties no qual obtenho um conteúdo específico, o qual pode ser qualquer coisa.
Não posso criar regras para esses valores, ou seja, não posso dizer que para informar & , deve-se informar &, por exemplo.

Criei um método apenas para teste:

 public static void main(String[] args) {
        String texto = "Teste <%ababababa%>  outro teste <%123b%&*&()a4b<b>%> teste de novo <%1@$%&*%&23b%&*()a4b<b>%> teste de novo <%1@$%&*%&23b%&*()&&&&a4b<b>%>";
        Pattern pattern = Pattern.compile("<%(.*?)%>");
        Matcher matcher = pattern.matcher(texto);
        String tags = "";
        while (matcher.find()) {
            String group = matcher.group(1);
            tags += group + " ";
            System.out.println(tags);
            texto = texto.replaceFirst("<%(.*?)%>", group);
            System.out.println(texto);
        }
       
    }

O resultado, e erro, que exibido é o seguinte

ababababa 
Exception in thread "main" java.lang.IllegalArgumentException: Illegal group reference
	at java.util.regex.Matcher.appendReplacement(Unknown Source)
	at java.util.regex.Matcher.replaceFirst(Unknown Source)
	at java.lang.String.replaceFirst(Unknown Source)
	at com.cpqd.promus.ebpp2.teste.Test.main(Test.java:18)
Teste ababababa  outro teste <%123b%&*&()a4b<b>%> teste de novo <%1@$%&*%&23b%&*()a4b<b>%> teste de novo <%1@$%&*%&23b%&*()&&&&a4b<b>%>
ababababa 123b%&*&()a4b<b> 
Teste ababababa  outro teste 123b%&*&()a4b<b> teste de novo <%1@$%&*%&23b%&*()a4b<b>%> teste de novo <%1@$%&*%&23b%&*()&&&&a4b<b>%>
ababababa 123b%&*&()a4b<b> 1@$%&*%&23b%&*()a4b<b> 

Se eu retiro o texto.replaceFirst("<%(.*?)%>", group); consigo visualizar normalmente tudo que está entre <% e %>.
Porém como relpaceFirst gera a exceção acima.

Por que você quer usar o replaceFirst se já achou o que queria?

Esse método é só um teste.
O conteúdo entre <% e %> seria uma chave a qual a partir dela irei obter um outro texto , o qual devo alterar na String.
Por isso o replaceFirst.
No caso desse teste, ao invés de eu obter o texto no properties, eu estou substituindo o <%XXX%> com o XXX apenas.

Veja se é isso;

package teste;

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Teste {
	public static void main(String[] args) {  
	       String texto = "Teste &lt;%ababababa%&gt; outro teste &lt;%xxxxxx%&gt; teste de novo &lt;%cccccc%&gt; teste de novo &lt;%bbbbbbb%&gt;";  
	       String str1 = "&lt;%&quot;;
	       String str2 = &quot;%&gt;&quot;;
	       String regex = Pattern.quote(str1)+&quot;(.*?)&quot;+Pattern.quote(str2);
	       Pattern p = Pattern.compile(regex);
	       Matcher m = p.matcher(texto);
	       while(m.find()){
	           String group = m.group(1);
	           texto = texto.replaceFirst(&quot;&lt;%&quot;+group+&quot;%&gt;&quot;, group); 
	           System.out.println(&quot;--&quot;+group);
	           System.out.println(texto);
	       }
	        
	   } 
}

ribclauport , o seu método funciona com a String que vc criou, porém, com a String que eu criei no meu exemplo não funciona.
Como pode vir qualquer coisa, eu tenho que considerar que virá caracteres especiais também.

Consegui desta forma

 texto = texto.replaceFirst("<%(.*?)%>", java.util.regex.Matcher.quoteReplacement(group));