Ciao il programma sottostante data una stringa , rappresentante una espressione
lettere e parentesi, dovrebbe sostituire alla prima occorrenza di un blocco di parentesi considerato es (AB) una stringa chiave.

se il blocco fosse: (AB)
e la stringa Riga: (HJ(AB)(GH)(AB))
dovrei avere come output
(HJ°1°(GH)(AB))

tuttavia il codice sottostante con replaceFirst va in loop,qualcuno mi può aiutare gentilmente a capire l'errore? e nel caso consigliare una idea alternativa????
codice:
	       Scanner in_Str=new Scanner(System.in);		
		Pattern patternRiga     = Pattern.compile("([(]([A-Z0-9°]+)[)])");
		String Riga     ="",Riga2="";
		String blocco ="";
		String espr2="";
		int kB=1;
        StringTokenizer St ;
  
    do{     
	   System.out.println("****************************************IMMETTI RIGA******************************************************");
	    Riga=in_Str.nextLine();	

	     while(Riga.contains("(")){	
	      	 Matcher matcher = patternRiga.matcher(Riga);
	      	       while( matcher.find() ){//finche ci sono parentesi elementari 
	  			   	   	 blocco=matcher.group();  
	  			   	   	 String chiave= "°".concat(String.valueOf(kB)).concat("°");
	  			   	   	  //********* CALCOLO BLOCCO *********
	  	         //replace    	   
	  Riga2=Riga.replaceFirst(blocco,chiave);  //<---ERROREEEE!
         Riga=Riga2;  
	  					 System.out.println(Riga);  
	  					 kB++;
	  		      }		
	     }	
	     
    }while(true);